汇编——标号、符号定义、编译运算
1、使用编辑器建立源程序文件t211.asm:
edit t211.asm
内容如下:
mycode segment
Assume cs:mycode
Start: Mov ax,0
Mov cx,1
Try: add ax,cx
Inc cx
Jmp try
mycode ends
End start
编译这个源程序文件:masm t211.asm
有错则返回编辑修改,编译通过后连接:Link t2111.obj
成功后用debug调入内存:debug t211.exe
反汇编观察程序,源程序中jmp try指令中标号try变成什么值,为什么?
此程序功能是什么?单步运行程序验证。
源程序中jmp try指令中标号try变成 0006。
jmp是无条件转移指令,jmp后的标号即为运行jmp命令后的IP要改变的偏移量。
此程序的功能是求得自然数的和,将其存入ax中。
使用t命令单步执行程序发现结果一致。
2、使用编辑器建立源程序文件t212.asm:
edit t212.asm
内容如下:
mycode segment
Assume cs:mycode
Start: Mov ax,1234
Mov ax,1+2
Mov ax,3*5
Mov ax,13/2
Mov ax ,3+4*2
mycode ends
End start
编译连接后用debug运行程序,观察验证每条指令运行后AX的结果。
实验结果如下:
运行指令 运行后AX的结果
Mov ax,1234 04D2h
Mov ax,1+2 0003h
Mov ax,3*5 000Fh
Mov ax,13/2 0006h
Mov ax ,3+4*2 000Bh
3、建立源程序t213.asm
Data segment
X1 db 1
X2 dw 2
X3 equ 100
Data ends
Stack segment para stack
Db 10 dup(0)
Stack ends
Code segment
Assume cs:code,ds:data,ss:stack
Start: mov ax,data
Mov ds,ax
Mov al,x1
Mov ax,x2
Mov al,x2
Mov ax,x1
Mov al,x3
Mov ax,x3
Code ends
End start
该程序编译后有什么问题?如何修改?x1、x2、x3有何不同?
编译后出现warning信息,mov al,x2 和 mov ax,x1出现操作类型不匹配,即不能出现将x2字放到字节中(al中),x1字节放入AX中。
改为mov ax,x2和mov al,x1就可以了。
4、建立t214.asm
Data segment
X1 db 1,2,3,4,5,6
X2 dw 7,8,9
num equ x2-x1
num1 equ $-x2
a=x1+3
b equ x1[si]
c equ x2+1
Data ends
Stack segment para stack
Db 10 dup(0)
Stack ends
Code segment
Assume cs:code,ds:data,ss:stack
Start: Mov ax,data
Mov ds,ax
Mov si,num-2
Mov al,a
Mov al,b
Mov bx,c
Mov al,x1[1]
Mov ax,x2[1]
Mov al,x1+2
Mov ax,x2+2
Mov di,num1-3
Mov ax,x2[di]
Code ends
End start
编译连接后用debug调入内存
指令执行时相关寄存器都为什么值。进行验证
Mov ax,data 运行后ax变为076Ah
Mov ds,ax 运行后ds变为076Ah
Mov si,num-2 运行后si变为0004h
Mov al,a 运行后al变为04h
Mov al,b 运行后al变为05h
Mov bx,c 运行后bx变为0800h
Mov al,x1[1] 运行后al变为02h
Mov ax,x2[1] 运行后ax变为0800h
Mov al,x1+2 运行后ax变为0803h
Mov ax,x2+2 运行后ds变为0008h
Mov di,num1-3 运行后di变为0003h
Mov ax,x2[di] 运行后ax变为0900h
使用t命令逐步验证结果正确。