汇编语言第三章
汇编语言程序
以下内容对应王爽老师的教材章节号
用汇编语言编写程序的过程
- 程序员编写汇编程序→编译器将其编译为机器码→计算机执行
DATA SEGMENT ;伪代码
BUF DB 'HELLO WORLD!$' ;伪代码
DATA ENDS ;伪代码
CODE SEGMENT ;汇编指令
ASSUME CS:CODE ;汇编指令
START:
MOV AX, DATA ;汇编指令
MOV DS, AX ;汇编指令
MOV DX, OFFSET BUF ;汇编指令
MOV AH, 09H ;汇编指令
INT 21H ;汇编指令
MOV AH, 4CH ;程序返回
INT 21H ;程序返回
CODE ENDS ;伪代码
END START ;伪代码
伪代码
- 伪代码是没有对应机器码的指令,最终不会被cpu所执行
- 伪指令是有编译器来执行的指令,编译器根据伪指令来进行相关的编译工作
- 不是指导机器工作的,而是指导编译器把汇编语言的源程序转成机器码用的
程序返回
MOV AH, 4CH
INT 21H
- **(固定套路)**程序结束运行后,将cpu的控制权交还给使它得以运行的程序(通常为dos系统)
程序中的三种伪指令
如何写一个汇编程序
用debug装载程序
[]和()
loop指令
-
功能:实现循环(计数型循环)
-
格式:
loop 标号
- 执行到标号所标记的语句时会进行循环
- 标号实际上在汇编代码里面对应的是标记语句的偏移地址
-
CPU在执行loop指令是时候要进行的操作
- (CX) = (CX)- 1(先-1再判断)
- 判断CX中的值,如果不为零则转到标号处执行程序,如果为零,将继续向下执行程序,也就是退出循环了(因此CX被称为计数寄存器)
- 因此CX中要提前存放循环次数,因为(CX)影响着loop指令的执行结果
- CX的值就是循环次数
段前缀的使用
-
-
ES:附加段段寄存器
在代码段中使用数据
- 首先直接在程序中写入物理地址是很危险的,稍有不慎可能会导致某个程序的崩溃.
- 那么相对应的对策则是,在程序的段中存放数据,运行时有操作系统分配空间.
- 数据段,代码段,栈段,各种段中都可以有数据,我们可以在单个的段中放置数据,也可以将数据,代码,栈放入不同的段中
- 但是为了在编译过程中让数据从默认的0开始,让代码从正确的IP位置开始,要给代码段添加标号
start:
- 指示代码开始的位置
end start
- 不止可以通知编译器程序结束,还可以通知编译器程序的入口在什么地方
将数据,代码,栈放入不同段
-
-
注意:代码段是程序自动给CS赋值为0,故而不用给CS进行MOV操作