子程序调用与宏定义的异同_汇编知识点

本文详细介绍了汇编语言中的子程序调用与宏定义,包括存储器的组织结构、寻址方式、数据传送指令、控制转移指令以及子程序调用的流程。讨论了子程序调用与宏定义在功能、使用场景和实现方式上的异同,强调了宏的灵活性和子程序执行效率的差异。同时,还探讨了中断指令和DOS基本调用在实际应用中的作用。
摘要由CSDN通过智能技术生成

第一章

十进制与二进制之间的转换:降幂法、除法

十进制与六进制之间的转换:降幂法、除法

补码表示:正数:采用符号—绝对值法

负数:先写出对应的正数的补码表示,然后再将其按位数求反,最后末尾加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=串地址串必须以$结束,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值