汇编——Masm使用及程序结构
Masm使用及程序结构
1、使用编辑器建立源程序文件test1.asm:
edit test1.asm
内容如下:
Data segment
X1 db 1ah
Y1 db 2bh
X2 dw 1234h
Y2 dw 0abcdh
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 ax,x2
Mov bx,y2
Push ax 将ax压入堆栈,栈顶指针SP自动减2
Mov dh,y1
Mov ah,4ch
Int 21h
Code ends
End start
编译这个源程序文件:masm test1.asm
有错则返回编辑修改,编译通过后连接:Link test1.obj
成功后用debug调入内存:debug test1.exe
画出内存中这3个段,标出段起始地址及段内存储的内容;
标出几个变量对应的偏移量(IP为指令指针寄存器,用来存放代码段中的偏移地址。在程序运行过程中,它始终指向下一条指令的首地址.)
标出栈底的位置
单步运行程序,观察ds的变化;观察相关寄存器;观察SP
Push ax 将ax压入堆栈,栈顶指针SP自动减2
结果可由图示:
数据区可由图示:
此例中,若有如下操作:
mov ax,x1
mov bl,x2 将会怎样?说明什么?
只有AX和BX寄存器里的内容发生变化,其他各寄存器不变。说明该操作只对数据段产生影响,不影响代码段和堆栈段。
2、编程完成字运算:W=X+Y-Z
源程序:
Data segment
X dw 2
Y dw 3
Z dw 1
W dw ?
Data ends
Stack segment para stack
Dw 10 dup(0)
Stack ends
Code segment
Assume cs:code,ds:data,ss:stack
Start: mov ax,data
mov ds,ax
mov ax,x
add ax,y
sub ax,z
mov w,ax
mov ah,4ch
int 21h
Code ends
End start
程序编译通过。
可从数据段的起始地址d076A:0000查看内存,图示结果可见正确。
3、建立源程序test2.asm
Data segment
X1 db 1
X2 db 2
X3 db 3,4,5,6
X4 dw 0ah
X5 dw 0bh,0ch,12abh
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,x3
Mov bx,x5
Code ends
End start
编译连接后用debug调入内存
画出数据段在内存中的存放情况,各个变量的位置(偏移量)
数据段段基址为076a
4、建立test3.asm
Data segment
X1 db ‘ABCDE’
X2 db 41h,42h,43h,44h,45h
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 bl,x2
Code ends
End start
编译连接后用debug调入内存
画出数据段在内存中的存放情况,各个变量的位置(偏移量)
数据段段基址为076a
所以A,B,C,D,E对应的ASCII码分别是41,42,43,44,45
5、建立test4.asm
Data segment
X1 db 6 dup(2)
X2 dw 4 dup(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 al,x1
Mov bl,x2
Code ends
End start
编译连接后用debug调入内存
运行的截图我就不放了…
画出数据段在内存中的存放情况,各个变量的位置(偏移量)
数据段段基址为076a
6、建立test5.asm
Data segment
Org 0004h
NUM DB 75H
ARRAY DW 20H DUP(0)
ADR1 DW NUM
ADR2 DD NUM
ADR3 DW ARRAY[2]
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 ax,adr1
Mov bx,adr3
Code ends
End start
编译连接后用debug调入内存
画出数据段在内存中的存放情况,各个变量的位置(偏移量)、内容
数据段段基址为076a,Org 0004h表示NUM的偏移量为0004h
NUM的偏移量为0004,内容为75H;
ARRAY偏移量为0005,内容为20H个字,占64个字节;
ADR1(字)的内容为NUM的偏移量,为0004;
ADR2(双字)的内容为NUM的偏移量,为076A0004;
ADR3(字)的内容为ARRAY的偏移量加2,为0007。