微机原理 第四章:汇编语言程序设计
4.1 汇编语言程序框架
stack SEGMENT PARA 'stack'
DB 100 DUP('stack')
stack ENDS
;----------------------------------
data SEGMENT
<数据、变量在此定义>
data ENDS
;----------------------------------
code SEGMENT
ASSUME CS:code,DS:data,ES:data
start: MOV AX,data
MOV DS,AX
MOV ES,AX
<此处加入自己的程序段>
MOV AL,4CH
INT 21H
code ENDS
END start
4.2 汇编语言格式
4.2.1 操作数域
4.2.1.1 算术运算符
+(加),-(减),*(乘),/(除)
MOD(求余),SHL(左移),SHR(右移)
MOV AH,VR+2
MOV AL,3*10-20
MOV BH,10 MOD 3
MOV BL 01010B SHL 4
4.2.1.2关系运算符
EQ(相等),NE(不相等),LT(小于),GT(大于),
LE(小于等于),GE(大于等于)
4.2.1.3 分析运算符
SEG :提取标号或变量的段基址
OFFSET :提取标号或变量的偏移地址
TYPE :提取标号或变量的类型属性,常用数字表示
LENGTH :提取数组变量中所含变量的个数
SIZE :提取数组变量中所含变量的总字节数
SIZE x=TYPE x * LENGTH x
;假设数据段从40000H开始
DATA SEGMENT
V1 DB ABH,CDH
V2 DW 34C1H,213DH
V3 DD 12345678H,9ABCDEF0H
V4 DW 20DUP(5)
DATA ENDS
;SEG
MOV AX,SEG V1 ;(AX)=4000H
MOV BX,SEG V2 ;(BX)=4000H
MOV CX,SEG V3 ;(CX)=4000H
;OFFSET
MOV AX,OFFSET V1 ;(AX)=0
MOV BX,OFFSET V2 ;(BX)=2
MOV CX,OFFSET V3 ;(CX)=6
;TYPE
MOV AX,TYPE V1 ;(AX)=1
MOV BX,TYPE V2 ;(BX)=2
MOV CX,TYPE V3 ;(CX)=4
;LENGTH
MOV AX,LENGTH V1 ;(AX)=1
MOV BX,LENGTH V2 ;(BX)=1
MOV CX,LENGTH V3 ;(CX)=1
MOV DX,LENGTH V4 ;(DX)=20
;SIZE
MOV AX,SIZE V1 ;(AX)=1
MOV BX,SIZE V2 ;(BX)=2
MOV CX,SIZE V3 ;(CX)=4
MOV DX,SIZE V4 ;(DX)=40
4.2.1.4 综合运算符
PTR:将左边的类型指令指定给其右边的地址。
DATA1 DB 10H,20H,30H
DATA2 DW 4023H,1A00H
......
MOV AX,WORD PTR DATA1 ;(AX)=2010H
MOV BL,BYTE PTR DATA2 ;(BX)=23H
4.2.2 伪指令
4.2.2.1. 数据定义伪指令
DB 一个字节, DW 一个字
重复操作符DUP:当一个定义的存储区内的每个单元要放置同样的数据时可用。
符号定义伪指令EQU:
注:用EQU定义的符号未清楚前,不能重新定义(清楚定义可用PURGE伪指令),但用“=”定义的符号可在任何时候进行重定义。
4.2.2.2. 段定义伪指令
段名 SEGMENT
...
段名 ENDS
4.2.2.3. 段寻址伪指令
ASSUME 段寄存器:段名,段寄存器:段名
ASSUME CS:code,DS:data,ES:data
①. 代码段中必须至少有一个ASSUME语句;
②. 说明段名与段寄存器的对应关系,并没有把段基址值送入段寄存器。
4.2.2.5. 过程定义伪指令
过程名 PROC 属性
...
RET
...
过程名 ENDP
至少有一条RET指令,可在过程中的任何位置。
4.2.2.6. 程序计数器
$:表示程序下一个所能分配的存储单元的偏移地址。
DATA SEGMENT
A1 DB 10H,20H,30H
C1 EQU $-A1 ;$-A1=03H-00H=03H
DATA ENDS
4.2.2.7. 定位伪指令
ORG:指定下一条指令语句或变量的偏移地址。
4.3 DOS系统功能调用介绍
在DOS系统中,功能调用都是用软中断指令INT 21H来实现的
DOS键盘功能调用
返回DOS(功能号4CH)
使用户程序执行完后返回DOS提示符状态
MOV AH,4CH
INT 21H
从键盘输入一个字符(功能号=01H)
MOV AH,1
INT 21H
<AL中有键入的字符>
输入字符串(功能号=0AH)
MOV AH,0AH
LEA DX,<字符串缓冲区首地址>
INT 21H
在显示器上显示一个字符(功能号=02H)
MOV AH,2
MOV DL,<要显示的字符>
INT 21H
显示字符串(功能号=09H)
MOV AH,9
LEA DX,<字符串>
INT 21H
被显示的字符串必须以”$”结束。