简单的汇编语言源程序基本语法:
assume cs:code
code segment
mov ax , 0001H
add ax , ax
mov ax , 4C00H
int 21H
code ends
end
在汇编语言源程序中,包含两种指令分别是,汇编指令和伪指令:
汇编指令:
1)(mov ax , 0001H ·······int 21H)这些指令有对应的机器码,可以编译成机器指令,最终为CPU所执行。
2)mov ax , 4C00H
int 21H
这两行指令时作为一个程序的返回(程序返回就是当一个程序结束后,将CPU的控制权交给使它得以运行的程序)
伪指令:
1)assume 的作用是将有特定用途的段和相关的寄存器关联起来。
2)XXX segment ··········· XXX ends 用于定义一个段,segment为段的起始,ends是段的结束。而每个段都有一个标识,XXX就是这段的标识符。
3)end 标志着程序的结束。
汇编程序从写出到执行的过程:
编程 -> 源程序(.asm)-> 目标程序(.obj) -> 连接 -> 运行程序(.exe)-> 加载 -> 运行
练习:
assume cs:code
code segment
mov ax , 2000H
mov ss , ax ; 栈空间所在的段地址
mov sp , 0
add sp , 10 ;偏移地址
pop ax ;将内存中的栈空间的数据读取到寄存器中
pop bx
push ax ;将寄存器中的数据传送到内存中的栈空间
push bx
pop ax ;将内存中的栈空间的数据读取到寄存器中
pop bx
mov ax , 4c00H
int 21h
code ends
end
![](https://img-my.csdn.net/uploads/201304/18/1366218107_5545.jpg)
利用debug把程序加载到内存,同时给出内存中2000:0000 起的16个字节
mov ax , 2000
mov ss , ax
是定义栈空间所在的段地址
mov sp , 0
add sp , 10
是定义栈空间的偏移地址(在debug中貌似把mov sp , 0 的指令执行隐式进行了)
pop ax
pop bx
把栈空间里的数据进行读取
push ax
push bx
把寄存器中的数据压进栈空间
由于栈空间的操作时以字为单位,所以由图可见:
栈空间操作之前:
栈空间操作之后:
2000:000A和2000:000C的以字类型的数据发生了互换
再次进行
pop ax
pop bx
把栈空间里的数据进行读取
寄存器ax和bx的数据发生了互换