菜鸡遇上汇编和ubuntu,整乱了,记录一下笔记
已经安装masm和dosemu,安装过程笔记,虽然也不算笔记
终端输入 dosemu
在dos窗口输入 edit ,使用dosume的编辑器
ctrl+n 新建文件,编辑程序
参考程序(在20个学生成绩中查询8号学生的成绩)
DATA SEGMENT
TABLE1 DB 81, 78, 90, 64, 85, 76, 93, 82, 57, 80; 数据段数据,字节数据,8位,存储是用16进制存储,即 81 在数据段基址值:0000的位置占一个单元用51存储,78 在在数据段基址值:0001的位置占一个单元用4E存储,以此类推
DB 73, 62, 87, 77, 74, 86, 95, 91, 82, 71; 共20个数据,从数据段第0单元到第19单元
NUM DB 8; 存放在数据段第20单元
MATH DB ?; 存放在数据段第21单元
DATA ENDS
STACK1 SEGMENT PARA STACK
DW 20H DUP(0)
STACK1 ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA, SS: STACK1
START: MOV AX, DATA; AX <- table1
MOV DS, AX; DS <- AX=table1
MOV BX, OFFSET TABLE1; BX <- ptr table1
XOR AH, AH; AX=0000H, CF=OF=0
MOV AL, NUM; AL=08H, AX=0008H
DEC AL; AL=07H, AX=0007H
ADD BX, AX; BX <- [BX]+[AX]=( byte ptr table1) + 0007H, 即指向table1的第八个单元
MOV AL, [BX]; AL <- 52, 16进制52即10进制82
MOV MATH, AL; MATH <- 52
MOV AH, 4CH
INT 21H
CODE ENDS
END START
ctrl+x , 根据提醒保存文件,我这里文件名为tast1,后缀asm,即 tast1.asm
在doc输入 msam tast1.asm ,敲回车,看输出的提醒,如果文件有错误就重新编辑,、重新 msam tast1.asm, 生成 tast1.obj
输入 link tast1.obj ,回车,看输出提醒,同上,看不出什么异常就是没问题,生成 tast1.exe
输入 debug tast1.exe,回车,进入debug模式
debug命令
Q: 退出
D: 显示内存,多次输入D显示的是上一次显示已内存地址之后的内存,可显示指定地址 D[起始地址[:结束地址]]
eg: D07E2:0000
R: 检查寄存器
U: 反汇编命令,地址可指定
-R 解析
>> AX=0000 BX=0000 CX=007A DX=0000 SP=0040 BP=0000 SI=0000 DI=0000
DS=07D2 ES=07D2 SS=07E4 CS=07E8 IP=0000 NV UP DI PL NZ NA PO NC
07E8:0000 B8E207 MOV AX,07E2
前4个是通用寄存器,你知我知~~
SP=0040
前面代码 STACK1 SEGMENT 里面有一句 DE 20H DUP(0) ,意思是申请20H个字的空间,即40H字节
DS=07D2
这里是DS原来存放的东西,不是数据段的段基值,段基值由代码指出,继续往下看
ES=07D2
附加段段基值?
ss=07D2
堆栈段的段基值
CS=07E8, 07E8:0000 B8E207 MOV AX,07E2
代码段的段基值,即代码段开始的位置 输入 D07E8:0000可以查看程序反汇编数据
看到下一行的 07E8:0000 B8E207 MOV AX,07E2
细心可以看出数据相同,即内存 07E8 单元开始为代码段, 第一条指令为MOV AX,07E2 ,即 B8E207
此处07E2指出前面提到的数段段基值,即数据存放是从内存 07E2:0000 处开始存放的
-U 解析
-U解析
反汇编得到的代码,首句为 B8E207 , 末句为 F0,可以对应到输入 D07E8:0000 显示数据
-D解析
因为前面输入过D命令,此处定位到数据段0000位置
可见输出最左端为地址,07E2为数据段段基值,冒号后为偏移量
一行中间显示16个16进制数据第8个和第9个用 - 连接
52 4E ... 对应data segment中数据 81 78 ...
右端显示数据ascii码对应字符
-G 执行程序,执行程序之后内存数据可能改变,此处变量math的值(见上图07E2:0015的位置,即数据08之后,参考下图右侧圈出位置)由00变为52
that‘s all, 输入q退出