用汇编语言写的源程序,再到源程序的运行
汇编:
汇编指令
-
固定指令:mov ax,4c00h
int 21h
伪指令文本
段定义:
- 当一个汇编程序由多个·段组成,这些段被用来存放代码,数据或者栈空间来使用
- 一个有意义的汇编程序中至少要有一个段,这个段用来存放代码
- 定义程序中的段:每个段都要有段名
- 段名 segment——段的开始
- 。。。
- 段名——ends–段的结束
end(不是ends):
- 汇编程序结束标记,若程序的结尾处不加end,编译器在汇编程序时无法知道程序在何处结束
assume(假设:)
- 含义是假设某一段寄存器和程序用segment+…+ends定义段相关联–assume CS:codesg 指CS寄存器与codesg关联,将定义codesg当作程序代码段使用
汇编程序结构:
debug写入:
- 用于功能简单,短小,精悍程序
- 只需要包含汇编指令即可
单独编成源文件在编译成可执行文件:
- 适用于大程序
- 要汇编指令,指导编译器工作的伪指令
- 源文件有一些段构成存放代码,数据或者栈空间
注释:;+注释
常见错误:
- 语法错误
- 逻辑错误
源程序的运行
- *.obj目标文件
- *.LST列表文件
- *.CRF交叉引用文件
执行命令:
-
-t分步执行
-
继续执行:P(proceed):
- 类似T命令,逐条执行命令,显示结果,但通过子程序中断时,直接执行,然后显示结果
-
运行命令:G(go):
- 从指定地址处开始执行程序,直到遇到断点或程序正常结束
[…]和(…)规定和约定:
[…]一个内存单元描述:
-
内存单元的地址:
- 段地址
- 偏移地址
-
内存单元长度(类型)
(…)–表示一个内存单元或寄存器中的内容(学习方便的约定)
描述对象 | 描述方法 | 描述对象 | 描述方法 |
---|---|---|---|
ax中内容0010H | (ax)=0010H | 2000:1000内容为0010H | (2100H)=0010H |
mov ax,[2]功能 | (ax)=((ds)*16+2) | mov [2],ax功能 | ((ds)*16+2=(ax)) |
add ax,2功能 | (ax)=(ax)+2 | add ax,bx功能 | (ax)=(ax)+(bx) |
push ax功能 | (sp)=(sp)-2,((ss)*16+(sp)=(ax)) | pop ax功能 | (ax)=((SS)*16+(sp)),(sp)=(sp)+2 |
在约定idate表示常量:
- 例如:mov ax,[idate],[idate]可以为[0],[2]等
- mov ax,idate,idate可以为0,1,2等
loop指令
-
格式:loop+标号
-
执行loop指令要进行的操作:
- (cx)=(cx)-1
- 判断cx中的值
- 不为零则转至标号处执行程序
- 如果为零则不执行
-
要求:
- cx中要提前存放一个循环次数,因为(cx)影响着loop指令的执行过程
- 要定义一个标号
如下例,将数据,代码,栈放入不同的段:
初始化各段寄存器:
- mov ax,stack
- mov ss,ax
- mov sp,20h
- mov ax,data
- mov ds,ax
入栈:
- mov bx,0
- mov cx,8
- S:push [bx]
- add bx,2
- loop(s)
出栈:
- mov bx,0
- mov cx,8
- S0:pop[bx]
- add bx,2
- loop S0