第一章
十进制与二进制之间的转换:降幂法、除法
十进制与六进制之间的转换:降幂法、除法
补码表示:正数:采用符号—绝对值法
负数:先写出对应的正数的补码表示,然后再将其按位数求反,最后末尾加1,就可以得到负数的补码表示
补码运算:二进制数按位求反后在末尾加1
第二章
1、存储容量
1K =
1024 =210 (Kilo)
1M =1024K = 220
(Mega)
1G =
1024M = 230 (Giga)
1个二进制位:bit (比特) 8个二进制位:Byte(字节)1Byte = 8bit
2个字节:1 Word (字) 1Word = 2Byte = 16bit
2、存储单元地址和内容
1.存储器以字节(8 bit)为编程单位
2.每个字节单元都有唯一的地址编码
3.地址用无符号整数来表示(编程用十六进制表示)
4.一个字要占用相继的两个字节
5.低位字节存入低地址,高位字节存入高地址
6.字单元地址用它的低地址来表示
7.机器以偶地址访问(读/ 写)存储器
3、物理地址= 16
*段地址 + 偏移地址
4、存储器的分段:
20 根地址线:地址范围 00000H ~ FFFFFH (1MB)
机器字长16位:仅能表示地址范围 0000H ~ FFFFH (64KB)
小段:每16个字节为一小段,共有64K个小段
段起始地址:小段首地址
段的大小: 64K 范围内的任意字节
5、存储器的逻辑分段优点:
允许程序在存储器内重定位;
允许实模式程序在保护模式下运行;
有利于程序和数据的分离。
6、中央处理器 8086/8088寄存器组:
通用寄存器
数据寄存器:AX,BX,CX,DX
变址寄存器:SI、DI
指针寄存器:SP、BP
控制寄存器:IP、FLAGS
段寄存器:CS、DS、SS、ES
7、标志寄存器( FLAGS / PSW )
条件标志位: OF 溢出标志 SF符号标志 ZF 零标志
CF 进位标志 AF 辅助进位标志 PF奇偶标志
控制标志位: DF 方向标志 IF中断标志 TF 陷阱标志
8、寄存器与存储器的比较:
寄存器:在CPU内部;访问速度快;容量小,成本高;用名字表示;没用地址
存储器:在CPU外部;访问速度慢;容量大,成本低;用地址表示;地址可用各种方式形成
第三章
寻址方式
操作数
所在位置
物理地址
(PA)
格式
注意
1.立即寻址
存储器的代码段
无
MOV
AL, 5
只能用源操作数
操作数和源操作数的长度一致
2.寄存器寻址
寄存器
(唯一)
无
MOV
AX, BX
字节寄存器只有
AH
AL BH BL CH CL DH DL
CS 不能用 MOV 指令改变,
源操作数和目的操作数的字长一致
3.直接寻址
存储器
段地址
+位移量
MOV
AX,ES:[2000H]
MOV
AX,VALUE
MOV AX,[2000H]
默认的段地址存储在DS中
遇到BP的段地址存储在SS
可以使用段跨越前缀
4.寄存器
间接寻址
存储器
段地址
+基址
/变址
MOV
AX,[BX]
MOV
AX,ES:[BX]
可用的寄存器:BX BP SI DI
不允许使用AX、CX、DX
存放偏移地址(EA)
SRC 和 DST 的字长一致
使用BP时,默认的数据段是SS,
其余都是DS
5.寄存器
相对寻址
存储器
段地址
+基址
/变址
+位移量
MOV
AX,COU[SI]
MOV
AX,ES:[COU+SI]
MOV AX,[COU+SI]
可以使用段跨越前缀
6.基址变址寻址
存储器
段地址
+基址
+变址
MOV
AX,[BX+SI]
MOV
AX,[BX][SI]
可以使用段跨越前缀
7.相对
基址变址
存储器
段地址
+基址
+变址
+位移量
MOV
AX,MASK[BX][SI]
MOV AX.MASK[BX+SI]
可以使用段跨越前缀
9、数据传送指令
传送指令MOV
CPU内部寄存器之间的数据传送
指令格式:MOV DST, SRC
执行操作:(DST)
¬ (SRC)
注意: *DST、SRC 不能同时为段寄存器 MOV DS, ES ´
*
DST、SRC
不能同时为存储单元
*立即数不能直接送段寄存器 MOV DS, 2000H ´
*
DST 不能是立即数和CS
*不影响标志位
交换指令XCHG
指令格式:XCHG OPR1, OPR2
执行操作:(OPR1)
« (OPR2)
例:XCHG BX, [ BP+SI ] XCHG AL, BH
注意: * 两个操作数字长一致
* 两个操作数都不能是段寄存器
* 两个操作数都不能是立即数
* 两个操作数不能同时是存储单元
* 可以采用除立即寻址方式外的任何一种寻址方式。
* 不影响标志位
地址传送指令LEA、LDS、LES
1.有效地址送寄存器指令:LEA
REG, SRC 执行操作:(REG) ¬
SRC
2.指针送寄存器和DS指令:LDS
REG, SRC 执行操作:(REG) ¬
(SRC)
(DS)
¬ (SRC+2) 相继二字 ®
寄存器、DS
3.指针送寄存器和ES指令:
LES REG, SRC
执行操作:(REG)
¬ (SRC)
(ES)
¬ (SRC+2) 相继二字 ®
寄存器、ES
注意: * 源操作数必须为存储器操作数
* 目的操作数必须是一个16位通用寄存器,不能是段寄存器
* 源操作数可以是除立即寻址和寄存器寻址以外的任意一种寻址方式
* 不影响标志位
堆栈操作指令PUSH、POP
1.进栈指令:PUSH
SRC
执行操作:(SP) ¬ (SP)
– 2 ( (SP)+1, (SP) ) ¬
(SRC)
出栈指令:POP DST
执行操作:(DST) ¬ (
(SP)+1, (SP) ) (SP) ¬ (SP) +
2
堆栈:‘先进后出’的存储区,段地址存放在SS中,SP在任何时候都指向栈顶,进出栈后自动修改SP。
注意: * 堆栈操作必须以字为单位。
* 不影响标志位
* 不能用立即寻址方式 PUSH 1234H ´
*
DST不能是CS POP CS ´
堆栈的用途:临时保存寄存器的内容。
PUSH
AX
PUSH
BX
PUSH
CX
…… ;其间用到AX、BX、CX
POP
CX ; 后进先出
POP
BX
POP AX
标志操作指令
LAHF、SAHF、PUSHF、POPF、CLC、STC、CMC、CLD、STD、LI、STI
标志传送指令:
1.标志送AH指令:LAHF
执行操作:(AH)
¬ (FLAGS的低字节)
2.AH送标志寄存器指令:SAHF
执行操作:(FLAGS的低字节) ¬
(AH)
注意: * LAHF不影响标志位 * SAHF影响CF、PF、AF、ZF、SF
标志进栈指令:PUSHF
执行操作:(SP) ¬ (SP)
- 2 ( (SP)+1, (SP) ) ¬
(FLAGS)
标志出栈指令:POPF
执行操作:(FLAGS) ¬ (
(SP)+1, (SP) ) (SP) ¬ (SP) +
2
注意:PUSHF和POPF经常一起联用,完成保护、维护标志寄存器的内容或改变标志位的值。
标志位操作指令:
清进位标志指令CLC CF ←
0
置进位标志指令STC CF ←
1
进位标志取反指令CMC CF ←
CF
清方向标志指令CLD DF ←
0
置方向标志指令STD DF ←
1
清中断允许标志指令 CLI IF ←
0
置中断允许标志指令 STI IF ←
1
注意: * 只影响本指令指定的标志
10、加减法指令:
加法指令:ADD DST, SRC 执行操作: (DST) ¬
(SRC) + (DST)
带进位加法指令:ADC DST, SRC 执行操作: (DST) ¬
(SRC) + (DST) + CF
加1指令:INC OPR 执行操作: (OPR) ¬
(OPR) + 1
注意: * 除INC指令不影响CF标志外,均对状态标志位有影响。
各加法指令对条件标志位的影响:
SF=1,结果为负 ZF=1,结果为0 CF=1,和的最高有效位有向高位的进位
OF=1,两个操作数符号相同,而结果符号与之相反
CF位表示无符号数相加的溢出。
OF位表示带符号数相加的溢出。
减法指令:SUB DST, SRC 执行操作:(DST) ¬
(DST) - (SRC)
带借位减法指令:SBB DST, SRC 执行操作:(DST) ¬
(DST) - (SRC) - CF
减1指令:DEC OPR 执行操作:(OPR) ¬
(OPR) - 1
求补指令:NEG OPR 执行操作:(OPR) ¬ -
(OPR)
比较指令:CMP OPR1, OPR2 执行操作:(OPR1) - (OPR2)
各减法指令对条件标志位(CF/OF/ZF/SF)的影响:
CF=1,被减数的最高有效位有向高位的借位或 CF=1减数转换为加法运算时无进位
OF=1 两个操作数符号相反,而结果的符号与减数相同
CF位表示无符号数减法的溢出。
OF位表示带符号数减法的溢出。
NEG指令对CF/OF的影响
CF=0,操作数为0 OF=1,操作数为-128(字节运算)或-32727(字运算
11、乘除运算指令
无符号数乘法指令:MUL SRC 带符号数乘法指令:IMUL SRC
执行操作:字节操作数(AX) ¬ (AL)
* (SRC)
字操作数(DX, AX) ¬
(AX) * (SRC)
注意: * 目的操作数必须是累加器
* AL
(AX) 为隐含的乘数寄存器。 * AX
(DX,AX) 为隐含的乘积寄存器。
*
SRC不能为立即数。 *
除CF和OF外,对条件标志位无
乘法指令对CF/OF的影响:
MUL指令:CF,OF
=00乘积的高一半为零
11否则
IMUL指令:CF,OF
=00乘积的高一半是低一半的符号扩展
11否则
例:(AX) = 16A5H,(BX) = 0611H
(1)
MUL BX ; (DX, AX) ¬ (AX) *
(BX)
;
16A5*0611=0089 5EF5
;
(DX)=0089H (AX)=5EF5H CF=OF=1
(2)
IMUL BL ; (AX) ¬ (AL) *
(BL)
;
A5*11 Þ 5B*11=060B Þ F9F5
;
(AX) = 0F9F5H CF=OF=1
无符号数除法指令:
DIV SRC
带符号数除法指令:
IDIV SRC
执行操作:字节操作
(AL) ¬ (AX) / (SRC) 的商 (AH) ¬ (AX)
/ (SRC) 的余数
字操作(AX) ¬ (DX,
AX) / (SRC) 的商 (DX)
¬ (DX, AX) / (SRC) 的余数
注意: * AX (DX,AX) 为隐含的被除数寄存器。
* AL
(AX) 为隐含的商寄存器。 * AH
(DX) 为隐含的余数寄存器。
*
SRC不能为立即数。 *
对所有条件标志位均无定义。
12、类型转换指令
CBW
AL ® AX
执行操作:若(AL)的最高有效位为0,则(AH)= 00H,若(AL)的最高有效位为1,则(AH)= FFH
CWD
AX ® (DX,AX)
执行操作:若(AX)的最高有效位为0,则(DX)= 0000H,若(AX)的最高有效位为1,则(DX)= FFFFH
例:(AX) = 0BA45H
CBW
; (AX)=0045H CWD ; (DX)=0FFFFH (AX)=0BA45H
注意:
* 无操作数指令 *
隐含对AL 或AX 进行符号扩展* 不影响条件标志位
13、逻辑运算指令
逻辑非指令:NOT OPR * OPR不能为立即数
执行操作: (OPR) ¬
(OPR) * 不影响标志位
CF
OF
SF
ZF
PF
AF
0
0
*
*
*
无定义
逻辑与指令:AND DST, SRC 执行操作:
(DST) ¬ (DST) Ù
(SRC)
逻辑或指令:OR DST, SRC 执行操作:
(DST) ¬ (DST) Ú
(SRC)
异或指令: XOR DST, SRC 执行操作:
(DST) ¬ (DST) "
(SRC)
测试指令: TEST OPR1, OPR2 执行操作:
(OPR1) Ù (OPR2)
14、移位指令
逻辑左移 SHL OPR, CNT
逻辑右移 SHR OPR, CNT
算术左移 SAL OPR, CNT(同逻辑左移)
算术右移 SAR OPR, CNT
循环左移 ROL OPR, CNT
循环右移 ROR OPR, CNT
带进位循环左移 RCL OPR, CNT
带进位循环右移 RCR OPR, CNT
注意: * OPR可用除立即数以外的任何寻址方式
*
CNT=1, SHL OPR,
1
CNT>1,MOV CL, CNT SHL OPR, CL ; 以SHL为例
* 条件标志位:
CF
= 移入的数值 1
CNT=1时,最高有效位的值发生变化
0
CNT=1时,最高有效位的值不变
移位指令:SF、ZF、PF 根据移位结果设置,AF无定义
循环移位指令:不影响SF、ZF、PF、AF
15、控制转移指令:
·
无条件转移指令 JMP
·
条件转移指令
JZ /
JNZ 、 JE / JNE、
JS / JNS、 JO / JNO、
JP /
JNP、 JB / JNB、
JL / JNL、 JBE / JNBE、
JLE
/ JNLE、 JCXZ
·
循环指令 LOOP、LOOPZ / LOOPE、LOOPNZ / LOOPNE
·
子程序调用和返回指令 CALL、RET
·
中断与中断返回指令 INT、INTO、IRET
16、与转移地址有关的寻址方式:
用来确定转移指令及转子指令的转向地址
段内寻址 段内直接寻址 JMP NEAR PTR NEXT
段内间接寻址 JMP TABLE [ BX ]
段间寻址 段间直接寻址 JMP FAR PTR NEXT
段间间接寻址 JMP DWORD PTR [ BX ]
无条件转移指令:
段内直接短转移:JMP SHORT OPR
执行操作:(IP) ← (IP) +
8位位移量
段内直接近转移:JMP NEAR PTR OPR
执行操作:(IP) ← (IP) +
16位位移量
段内间接转移: JMP WORD PTR OPR
执行操作:(IP) ←
(EA)
段间直接远转移:JMP FAR PTR OPR
执行操作:(IP) ←
OPR 的段内偏移地址(CS) ← OPR 所在段的段地址
段间间接转移:JMP DWORD PTR OPR
执行操作:(IP) ← (EA)
(CS) ← (EA+2)
注意:* 不影响标志位
17、条件转移指令
注意:* 只能使用段内直接寻址的8 位位移量 * 不影响标志位
(1) 根据单个条件标志的设置情况转移
格式 测试条件
JZ(JE) OPR ZF = 1
JNZ(JNE) OPR ZF = 0
JS
OPR SF = 1
JNS
OPR SF = 0
JO
OPR OF = 1
JNO
OPR OF = 0
JP
OPR PF = 1
JNP
OPR PF = 0
JC
OPR CF = 1
JNC
OPR CF = 0
(2) 比较两个无符号数,并根据比较结果转移
格式 测试条件
< JB
(JNAE,JC) OPR CF = 1
≥ JNB (JAE,JNC) OPR CF = 0
≤ JBE (JNA) OPR CF∨ZF = 1
> JNBE (JA) OPR CF∨ZF = 0
* 适用于地址或双精度数低位字的比较
(3) 比较两个带符号数,并根据比较结果转移 * 适用于带符号数的比较
格式 测试条件
< JL
(JNGE) OPR SF"OF = 1
≥ JNL (JGE) OPR SF"OF = 0
≤ JLE (JNG) OPR (SF"OF)∨ZF =
1
> JNLE (JG) OPR (SF"OF)∨ZF =
0
(4) 测试 CX 的值为 0 则转移
格式 测试条件
JCXZ
OPR (CX)=0
18、循环指令
注意: * CX 中存放循环次数
* 只能使用段内直接寻址的8 位位移量 * 不影响标志位
LOOP
LOOPZ / LOOPE
LOOPNZ / LOOPNE
执行步骤:(1) (CX) ←
(CX) – 1
(2)检查是否满足测试条件,如满足则(IP) ← (IP) +
8位位移量,实行循环;
不满足则IP 不变,退出循环
循环指令:LOOP OPR
测试条件:(CX) ¹
0
为零或相等时循环指令:LOOPZ(LOOPE) OPR
测试条件:ZF=1 且 (CX) ¹
0
不为零或不相等时循环指令:LOOPNZ(LOOPNE) OPR
测试条件:ZF=0 且 (CX) ¹
0
19、例:求首地址为ARRAY
的M 个字之和,结果存入TOTAL
MOV
CX, M
MOV
AX, 0
MOV
SI, AX
AGAIN:
ADD
AX, ARRAY[SI]
ADD
SI, 2
LOOP
AGAIN
MOV
TOTAL, AX
20、串处理指令
·
串处理指令 · 串重复前缀
LODSB / LODSW REP
STOSB / STOSW REPE / REPZ
MOVSB / MOVSW REPNE / REPNZ
SCASB / SCASW
CMPSB / CMPSW
LODS 从串取指令:
LODS
SRC
LODSB (字节)
LODSW (字)
执行操作: 字节操作:(AL)←((SI)),
(SI)←(SI)±1
字操作:(AX)←((SI)),
(SI)←(SI)±2
注意:
* LODS 指令一般不与REP
联用
* 源串一般在数据段中(允许使用段跨越前缀来修改),
目的串必须在附加段中
* 不影响条件标志位
STOS 存入串指令:
STOS
DST
STOSB (字节)
STOSW (字)
执行操作: 字节操作:((DI))←(AL),
(DI)←(DI)±1
字操作:((DI))←(AX),
(DI)←(DI)±2
MOVS串传送指令:
MOVS
DST, SRC
MOVSB (字节)
MOVSW (字)
例:MOVS ES: BYTE PTR [DI], DS: [SI]
执行操作:(1) ((DI)) ←
((SI))
(2) 字节操作:(SI)←(SI)±1,
(DI)←(DI)±1
字操作:(SI)←(SI)±2,
(DI)←(DI)±2
方向标志 DF=0 时用+ ,DF=1 时用 - 。
SCAS串扫描指令:
SCAS
DST
SCASB (字节)
SCASW (字)
执行操作: 字节操作:(AL) - ((DI)), (DI)←(DI)±1
字操作:(AX) - ((DI)), (DI)←(DI)±2
CMPS串比较指令:
CMPS
SRC, DST
CMPSB (字节)
CMPSW (字)
执行操作:(1) ((SI)) -
((DI))根据比较结果置条件标志位:相等ZF=1;不等ZF=0
(2) 字节操作:(SI)←(SI)±1,
(DI)←(DI)±1
字操作:(SI)←(SI)±2,
(DI)←(DI)±2
REP(与MOVS/
STOS配合工作)
执行操作:(1) 如 (CX)=0 则退出 REP,否则转(2)
(2)
(CX) ¬ (CX) -1
(3) 执行 MOVS / STOS / LODS
(4) 重复 (1) ~ (3)
REPMOVS:将数据段中的整串数据传送到附加段中。
源串(数据段)→目的串(附加段)
执行REP MOVS 之前,应先做好:
(1) 源串首地址(末地址)→SI
(2) 目的串首地址(末地址)→DI
(3) 串长度 →CX
(4) 建立方向标志 ( CLD 使 DF=0,STD 使 DF=1 )
REPE/
REPZ
REPNE/
REPNZ
(与CMPS和SCAS配合工作)
执行操作:(1) 如(CX)=0 或ZF=0 (ZF=1) 则退出串操作,否则转(2)
(2)
(CX)←(CX) -1
(3) 执行 CMPS / SCAS
(4) 重复 (1) ~ (3)
例:从一个字符串中查找一个指定的字符
mess
db ‘COMPUTER’
lea
di, mess
mov
al, ‘T’
mov
cx, 8
cld
repne scasb
例:比较两个字符串,找出它们不相匹配的位置
lea
si, mess1
lea
di, mess2
mov
cx, 8
cld
repe
cmpsb
例:反向传送
lea
si, mess1+7
lea
di, mess2+7
mov
cx, 8
STd
rep
movsb
第四章
21、标号和变量
(1)标号和变量都是标识符。
标识符组成:字母a~z ,数字0~9,专用字符? . @ _ $
标识符的组成规则:最大长度为31,第一个字符不能是数字,不区分字母的大小写,不能是汇编语言的保留字
(2)标号和变量的异同:
不同:标号:用于汇编指令语句中,以冒号结束,在代码段中定义,经常在转移指令或call指令
变量:用于伪指令语句中,不允许有冒号,在数据段或附加段中定义,经常在操作数字段出现
相同:都有三种属性:段属性、偏移属性、类型属性
22、伪操作
是汇编程序对源程序进行汇编时处理的操作,完成处理器选择、存储模式定义、数据定义、
存储器分配、指示程序开始结束等功能。
处理器选择伪操作
段定义伪操作
程序开始和结束伪操作
数据定义及存储器分配伪操作
表达式赋值伪操作
地址计数器与对准伪操作
基数控制伪操作
23、段定义伪操作
data
segment ; 定义数据段
…
data
ends
;----------------------------------------
extra segment ; 定义附加段
…
extra ends
;----------------------------------------
code
segment ; 定义代码段
assume cs:code, ds:data, es:extra
start: mov ax, data
mov
ds, ax ; 段地址 ® 段寄存器
…
code
ends
end
start
说明:语句序列
段假定伪指令ASSUME
格式:ASSUME
段寄存器名:段名(这里只是一种指明,段寄存器的实际值,必须在程序中使用传送指令来赋值,cs除外)
24、
数据定义及存储器分配伪操作:
[变量] 助记符 操作数[ , 操作数, … ] [
; 注释]
助记符:DB DW DD DF DQ DT
例:DATA_BYTE DB 10,4,10H,?
DATA_WORD DW 100,100H,-5,?
LABEL伪操作:
name LABEL type
例:BYTE_ARRAY LABEL BYTE
WORD_ARRAY DW 50 DUP (?)
tos
LABEL WORD
表达式名 EQU表达式
ALPHA EQU 9
BETA
EQU ALPHA+18
BB
EQU [BP+8]
说明:1、AB
EQU DATA_ONE+2 (表达式中的标号和变量要先定义,例如:DATA_ONE)
2、“ = ” 伪操作(允许重复定义)
……
EMP
= 7
……
EMP
= EMP+1
……
数值回送操作符:OFFSET、SEG、TYPE、LENGTH、SIZE
OFFSET/
SEG变量/标号
功能:回送变量或标号的偏址/ 段址
TYPE变量/标号/常数
DB
DW
DD
DF
DQ
DT
NEAR
FAR
常数
1
2
4
6
8
10
-1
-2
0
LENGTH变量
功能:回送由DUP定义的变量的单元数,其它情况回送1
SIZE 变量
功能:LENGTH * TYPE
例:
ARRAY DW 100 DUP (?)
TABLE DB ‘ABCD’
ADD
SI, TYPE ARRAY ; ADD SI, 2
ADD
SI, TYPE TABLE ; ADD SI, 1
MOV
CX, LENGTH ARRAY ; MOV CX, 100
MOV
CX, LENGTH TABLE ; MOV CX, 1
MOV
CX, SIZE ARRAY ; MOV CX, 200
MOV
CX, SIZE TABLE ; MOV CX, 1
属性操作符:PTR、段操作符、SHORT、THIS、HIGH、LOW
类型PTR表达式
MOV WORD PTR [BX], 5
段操作符 MOV ES: [BX], AL
SHORT标号 JMP
SHORT NEXT
THIS类型 TA EQU
THIS BYTE
TD
DW 1234H
NEXT
EQU THIS FAR
MOV
AX,2
HIGH和LOW
CONS EQU 1234H
MOV
AH, HIGH CONS
MOV
AL, LOW CONS
第五章
25、分支程序设计
(1) 条件控制
(2) 逻辑尺控制
(3) 地址跳跃表(值与地址有对应关系的表)
第六章
26、CALL 调用指令
段内直接近调用:CALL DST
执行操作:(SP) ← (SP) -
2
(
(SP)+1,(SP) ) ← (IP)
(IP)
← (IP) + 16位位移量
段内间接近调用:CALL DST
执行操作:(SP) ← (SP) -
2
(
(SP)+1,(SP) ) ← (IP)
(IP)
← (EA)
段间直接远调用:CALL DST
执行操作:(SP) ← (SP) -
2
(
(SP)+1,(SP) ) ← (CS)
(SP)
← (SP) - 2
(
(SP)+1,(SP) ) ← (IP)
(IP)
← 偏移地址
(CS)
← 段地址
段间间接远调用:CALL DST
执行操作:(SP) ← (SP) -
2
(
(SP)+1,(SP) ) ← (CS)
(SP)
← (SP) - 2
(
(SP)+1,(SP) ) ← (IP)
(IP)
← (EA)
(CS)
← (EA+2)
RET返回指令
段内近返回:RET
执行操作:(IP) ← (
(SP)+1,(SP) )
(SP)
← (SP) + 2
段内带立即数近返回:RET EXP
段间远返回:RET
执行操作:(IP) ← (
(SP)+1,(SP) )
(SP)
← (SP) + 2
(CS)
← ( (SP)+1,(SP) )
(SP)
← (SP) + 2
段间带立即数远返回:RET EXP
27、过程定义伪操作
过程名 PROC NEAR ( FAR )
过程名 ENDP
(1)NEAR属性:调用程序和子程序在同一代码段中(段内调用)
(2)FAR属性:调用程序和子程序不在同一代码段中(段间调用)
28、子程序调用与返回
子程序调用:隐含使用堆栈保存返回地址
call
near ptr subp
(1) 保存返回地址 (2) 转子程序
call
far ptr subp
(1) 保存返回地址 (2) 转子程序
子程序返回:ret
29、保存与恢复寄存器
subt
proc far
push
ax
push
bx
push
cx
push
dx
……
……
pop
dx
pop
cx
pop
bx
pop
ax
ret
subt
endp
30、子程序参数传递
(1) 通过寄存器传送参数
(2) 通过存储器传送参数
(3) 通过地址表传送参数地址
(4) 通过堆栈传送参数或参数地址
(5) 多个模块之间的参数传送
第七章
31、宏:源程序中一段有独立功能的程序代码。
宏指令:用户自定义的指令。在编程时,将多次
使用的功能用一条宏指令来代替。
宏与子程序的区别
宏
子程序
处理者
宏汇编程序
中央处理机
处理时间
在汇编过程中
程序执行时
处理方法
用宏体替换宏指令
用CALL指令调用
占用内存
占用内存空间多
占用内存空间少
运行速度
运行速度较高
运行速度较低
灵活性
十分灵活
不够灵活
宏定义、宏调用和宏展开
宏定义: macro_name MACRO [哑元表] ; 形参/虚参
[LOCAL 标号表]
……
…… ; 宏定义体
ENDM
宏调用:(必须先定义后调用)
macro_name [实元表] ; 实参
宏展开:汇编程序把宏调用展开
宏定义体 复制到宏指令位置,实参代虚参
LOCAL中的标号 ??0000~??ffff
32、宏定义中的参数
用参数代表自定义符号和数值
用参数代表指令 例如:定义将某存储区清零的宏指令
用参数代替寄存器名字例如:定义将任一个寄存器循环左移或右移n位的宏指令
用参数代表任何一个字符串或者子字符串例如:定义两个多精度数据求和的宏定义
33、宏汇编操作符:
& ;;
%
符号1
& 符号2 宏展开时,合并前后两个符号形成一个符号。
;; 注释 宏展开时,;;后面的注释不予展开。
% 表达式 汇编程序将%后面的表达式转换为数字,并在展开期间用这个数取代哑元。
第九章
34、中断指令: INT TYPE 或 INT
执行操作: (SP) ← (SP) –
2 ( (SP)+1,(SP) ) ←
(FLAGS)
(SP)
← (SP) – 2 ( (SP)+1,(SP) )
← (CS)
(SP)
← (SP) – 2 ( (SP)+1,(SP) )
← (IP)
(IP)
← (TYPE*4) (CS) ← (TYPE*4+2)
溢出中断指令:INTO
执行操作:若OF=1,(IP) ← (10H)
(CS) ← (12H)
35、从中断返回指令:IRET
执行操作:(IP) ← (
(SP)+1,(SP) )
(SP)
← (SP) + 2
(CS)
← ( (SP)+1,(SP) )
(SP)
← (SP) + 2
(FLAGS) ← (
(SP)+1,(SP) )
(SP)
← (SP) + 2
注意:
*
TYPE (0~255) 是中断类型号,
隐含的类型号为3
*
INT 指令还把 IF 和
TF 置0,但不影响其它标志位
*
IRET 指令执行完,标志位由堆栈中取出的值确定
36、BIOS和DOS基本调用
调用方法:
1、将调用参数装入指定的寄存器中;
2、BIOS或DOS功能号装入AH;
3、如需子功能号,把它装入AL;
4、按中断号调用DOS或BIOS中断(INT);
5、检查或取得返回参数。
37、Dos显示功能中断 int 21h
AH 功 能 调 用 参 数
2 显示一个字符(检验Ctrl-Break) DL = 字符
6 显示一个字符(不检验Ctrl-Break) DL = 字符
9 显示字符串 DS:DX=串地址串必须以$结束,