微机原理 - 汇编语言程序设计基本方法 - 图文

更新时间:2023-10-30 10:17:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

汇编语言程序设计基本方法

第四章 汇编语言程序设计基本方法

4.1 汇编语言基本概念汇编语言与机器语言

4.1.1 编语言与机器语言

汇编语言是用意义明确的助记符来表示指令的操作码、操作数。汇编语言是面向

机器的语言,不同的机器有不同的汇编语言。用汇编语言编写的程序具有执行速度快、占用存储空间小、实时性能好等待点。汇编语言放大量用于编写计算机系统程序、实时控制程序等。

用汇编语言编写的程序称为汇编语言源程序(简称汇编语言程序)。计算机必须将汇 编语言程序翻译成由机器代码组成的目标程序才能执行。这个翻译过程称为汇编。自动 完成汇编过程的软件叫汇编程序。 汇编语言的语句有两种基本类型:指令与伪指令。

4.1.2 编语言中语句的组成

名称 空格 : 操作助记符 空格 操作数 ; 注释 例如: CYCLE: ADD AX ,02;(AX)?(AX)+02 DATA1 DB 20H,30H,40H,50H

1. 名称

1)组成名字的字符

(1)字母A—Z (2)数字0一9;

(3)专用字符?、. 、@、_、$

2)组成名称的规则

(1)除数字0一9外所有字符都可以放在名字的第一个位置。

(2)使用字符“.“时必须放在名字的第一个位置。

(3)名字最多可以使用31个字符、汇编程序不能识别多余的字符。

3)以冒号分割时,名称是一个标号;以空格分割时,名城既可以使标号,也

可以是变量。

2. 操作助记符(助记符)

操作助记符将指出该语句的基本操作功能。必须存在。 操作符可以是指令、伪指令或宏指令的助记符。 3. 操作数

操作数可以表示数字本身,也可以是指出如何获得操作数的信息。操作数不是必需的,操作数多于两个时,中间用逗号分割,操作数与操作助记符之间必须用空格分割。 4. 注释

近用作语句或程序的说明,不产生目标代码。

1

汇编语言程序设计基本方法

4.1.1 汇编语言中的常数与表达式

1. 常数

B:表示二进制数 10110011B D:表示十进制数 179D或179 O:表示八进制数 263O H:表示十六进制数 B3H 用单引号“‘”括起来的一串字符称为字符串常量

2. 表达式

表达式由操作数和操作符组成

操作数可以是常数或标识符、表达式

操作符:算术操作符、关系操作符、属性操作符及其它操作符等

(1) 算术操作符:+、-、*、/、MOD,双操作数操作符,操作数

必须为数字操作数,MOD的两个操作数必须都为正整数。 例如:

79 MOD 16

0B5H MOD 10H

(2) 逻辑操作符:AND(与)、OR(或)、NOT(非)、XOR(异

或)。操作数必须为两个数字,按位运算。 例如:

11001100B AND 11110000B 结果:11000000B 11001100B OR 11110000B 结果:11111100B NOT 11110000B 结果:00001111B 11001100B XOR 11110000B 结果:00111100B 注意:逻辑操作符同时也是逻辑运算指令的操作助记符。 例如: AND AL,0CH OR 0FH

(3) 关系操作符:EQ(相等)、NE(不等)、LT(小于)、GT(大

于)、LE(不大于)、GE(不小于);关系运算的操作数必须为数字,当关系成立时,其结果为全1;当关系不成立时,其结果为全0。

汇编语言中表达式不能单独构成语句,只能是语句的一部分。 例如:

MOV AX,BUF+2

ADD AL,VAL AND 0FH JMP AGAIN+3 MOV BL,VB LE VA

2

汇编语言程序设计基本方法

4.1.2 标号、变量及伪指令

1. 标号

标号是由标识符表示的指令的名称,指示对应指令的位置(地址)。

标号的三个属性:段地址、偏移地址和类型。标号的类型属性:NEAR和FAR;

NEAR:段内使用;FAR:段间使用

标号定义的基本方法:指令的助记符前加上标识符和冒号,例如: START:PUSH DS 2. 变量

(1) 变量的定义

变量通过伪指令定义: 变量名 DB 表达式;定义字节变量 变量名 DW 表达式;定义字变量 变量名 DD 表达式;定义双字变量 变量名 DQ 表达式;定义长字变量 变量名 DT 表达式;定义一个十字节变量

变量名是一个标识符,变量的类型与关键字DB、DW、DD、DQ、DT有关。

表达式的表示:

① 一个或多个常数或表达式 ② 带引号的字符串 ③ 一个问号“?”

④ 重复方式 重复次数 DUP(表达式) 例如: DATA1 DB 20H DATA2 DW 0204H,1000H DATA3 DB(-1*3),(15/3) DATA4 DD 12345H DATA5 DB ‘0123’ DATA6 DW ‘AB’,‘C’,‘D’ DATA7 DB ? DATA8 DD ? DATA9 DB 5 DUP(00) DATA10 DW 3 DUP(?) “?”:表示其值不确定

当表达式的值为字符串时,字节类型与字类型不同处理。 图4.1 P57页

(2) 变量的属性

① 段地址(SEG):变量所在段的段地址 ② 偏移地址(OFFSET):变量所在段内的偏移地址。 ③ 类型(TYPE):变量所占据的字节数

DB?1 DW?2 DD?4 DQ?8 DT?10

3

汇编语言程序设计基本方法

④ 长度(LENGTH):一个变量明所定义的变量的个数,用DUP为重复的个数。

⑤ 大小(SIZE):类型与长度的乘积 前三个为主属性,后两个为辅助属性 变量名 段地址 偏移地址 类型 长度 大小 DATA1 DATA2 DATA3 DATA4 DATA5 DATA6 DATA10 4.1.3 属性操作符及表达式

1. 获取属性的操作符 SEG (变量名或标号) 所在段的段地址 OFFSET (变量名或标号) 再段内的偏移量 TYPE (变量名或标号) 类型 LENGTH(变量名) 长度 SIZE (变量名) 大小 例如:

SEG DATA1 OFFSET DATA1 LENGTH DATA6 TYPE DATA6 SIZE DATA9

例如:

MOV AX, SIZE DATA9 MOV AX, SEG DATA1 MOV BL,TYPE DATA

例如: DAT1 DB 02H DAT2 DW 0F00H DAT3 DW 5 DUP(?) DAT4 DB LENGTH DAT3;存放变量DAT3的长度5 DAT5 DW DAT3;

2. PTR操作符

格式:类型 PTR 表达式

类型:BYTE WORD DWORD NEAR FAR 功能:重新定义已定义的变量或标号的类型 MOV BYTE PTR DAT3 AL

4

汇编语言程序设计基本方法

4.2 8086/8088指令系统

指令类型:

(1) 数据传送指令 (2) 算术运算指令 (3) 逻辑运算指令 (4) 移位指令

(5) 标志处理指令和CPU控制指令 (6) 转移和循环控制指令 (7) 调用和返回指令 (8) 字符串操作指令 (9) 输入、输出指令

4.2.1 数据传送类指令

通用传送指令包括:传送指令、进栈指令、出栈指令和交换指令。 1. 传送指令(MOV) MOV DST,SRC (DST)?(SRC)

其中SRC表示源操作数,DST表示目的操作数。

功能:将源操作数SRC的一个字节或一个字传送到目的操作数DST所指单元。 源操作数:通用寄存器、段寄存器、立即数和内存单元。 目的操作数:通用寄存器、段寄存器和内存单元。 (1) 累加器和存储器单元之间的传送 (2)存器之间的传送

(3) 寄存器和存储器单元之间的传送 (4) 立即数传送

(5) 段寄存器和通用寄存器之间的传送 (6) 段寄存器和存储器单元之间的传送 例如: MOV AX,BX MOV AL,DL MOV AX,02 MOV SI,[BX] MOV AL,4[DI] MOV AX,[BX+2] MOV [BX][DI],DX 重点讲述后三条指令 又例如: 变量的定义: DATA1 DW 20H,30H DATA2 DB 50H,60H,70H DATA3 DW 10H DUP(?) 相应传送指令: MOV AX,DATA1 MOV DATA3,BX

5

汇编语言程序设计基本方法

[对指令的执行进行说明]

NEG DST 指令称为取负指令,是一条单操作数指令。它的功能是将目的操作数的值取负。正数---》该数的负数的补码,负数(补码)--》该数的正数。

指令中操作数的寻址方式可采用除立即数外的各种寻址方式,但不能是段寄存器。 NEG AX NEG BYTE PTR[DI] NEG WORD PTR 4[BX] NEG DAT1[SI] 例如:第一条指令,设(AX)=00F2H,则结果(AX)=FF0EH,同时CF=1,SF=1,AF=1,PF=0,OF=0,ZF=0。

2. 比较指令

格式:CMP DST ,SRC ;DST-SRC并设置标志位

指令的功能:目的操作数减去源操作数,并根据相减结果设置各标志位。 CMP AL,BL CMP AL,[DI] CMP AX,CX CMP AX,06H

3. 增量和减量指令

INC DST DEC DST

均为单操作数指令。操作数的寻址方式为除立即数和段寄存器外的其他各种寻址方式。指令的功能是对目的操作数加1或减1。标志位初CF外都受影响。 INC AL INC BX INC WORD PTR 4[BX] DEC CX

11

汇编语言程序设计基本方法

4. 乘法与除法指令

MUL SRC

IMUL SRC ;有符号乘法,操作数同上。

例: MUL DAT1 IMUL CL MUL BYTE PTR

[BX]

(1) 带符号运算时,操作数和结果均以补码表示,结果的符号按一般的

运算规则确定。

(2) 乘法指令中的目的操作数的寻址方式是隐含的,并且一定是累加器

AX或AL。源操作数的寻址方式可采用除立即数和段寄存器外的各种寻址方式。

(3) 指令是字运算或字节运算由源操作数的类型确定。字运算:AX-》

DX:AX ,字节运算:AL--》AX

(4) 乘法指令执行后,标志寄存器中只有CF和OF位有意义,其它各

位不确定。MUL指令,结果中的高16位(字运算)或高8位(字节运算)均为0时,CF和OF被置0,否则置1。IMUL指令:结果中高16位(字运算)或高8位(字节运算)为低16位或低8位的符号扩展时,CF和OF被置0,否则CF和OF置1。

乘除法指令分带符号运算和不带符号运算两种。 例:比较MUL与IMUL乘法的不同: DAT1 DW 8004H MOV AX,05H MUL DAT1 MOV AX,05H MUL BYTE PTR DAT1 MOV AX,05H IMUL BYTE PTR DAT1

12

汇编语言程序设计基本方法

MOV AX,05H IMUL WORD PTR DAT1

4条指令的运行

(1) 无符号字运算 (2) 无符号字节运算 (3) 带符号字节运算 (4) 带符号字运算

除法指令中的目的操作数的寻址方式也是隐含的,并且一定是DX:AX或AX。

5. 符号扩展指令 CBW AL的符号据扩展到Ah中 CWD AX中的符号扩展到DX中

6. BCD数调整指令

BCD数调整指令的操作数均为隐含寻址(AL,AX) AAA 加法分离BCD数调整,影响AF,CF AAS 减法分离BCD数调整,影响AF,CF DAA 加法组合BCD数调整,OF标志位无定义,影响其余各标志位 DAS 减法组合BCD数调整,OF标志位无定义,影响其余各标志位 AAM 乘法分离BCD数调整,影响SF,ZF,PF,但OF,AF,CF无定义 AAD 除法分离BCD数调整,影响SF,ZF,PF,但OF,AF,CF无定义

对BCD数进行十进制运算

(1) 对BCD数按二进制进行运算 (2) 对运算结果进行相应的调整

调整方法是:

累加器AL低4位大于9或辅助进位标志位AP=1,则累加器AL加06H修正。

累加器AL高4位大于9或进位标志位CY=1,则累加器AL加60H修正, 累加器AL高4位大子等于9,低4位大于9,则累加器AL进行加66H修正。

13

汇编语言程序设计基本方法

BCD码是一种用二进制编码的十进制数,又称为二一十进制数。8086/8088中BCD码分为两种形式:其一是用四位二进制数表示一位十进制数,称为压缩的BCD码;其二是用八位二进制数表示一位十进制数、称为非压缩的BCD码,它的低四位是BcD码,高四位没有意义。AAM和AAD只能调整分离BCD码的运算。

例:求两个4位组合BCD数的和 BCD1 DB 45H,19H BCD2 DB 71H,12H BCD3 DB 2 DUP(?) MOV AL,BCD1 ADD AL,BCD2 DAA MOV BCD3,AL MOV AL,BCD1+1 ADC AL,BCD2+1 DAA MOV BCD3+1,AL

例:设有两数X,Y,且X=85,Y=6,用分离BCD数完成X/Y BCD1 DB 05H,08H BCD2 DB 06H BCD3 DB 3 DUP(?) MOV AH,0 MOV AL,BCD1+1 MOV BL,BCD2 DIV BL MOV BCD3+1,AL MOV AL,BCD1 AAD DIV BL MOV BCD3,AL MOV BCD3+2,AH

14

汇编语言程序设计基本方法

4.2.3 逻辑运算类指令

AND DST,SRC AND DST,DATA OR DST,SRC OR DST,DATA XOR DST,SRC XOR DST,DATA TEST DST,SRC TEST DST,DATA NOT DST

SRC: 立即数,通用寄存器和任一寻址方式所制定的内存单元。

DST: 通用寄存器和任一寻址方式所制定的内存单元,但不允许是立即数。

指令可以是字节操作,也可以是字操作。NOT指令对标志位不产生影响,其余指令将使CF,OF置0,并以正常规则设置SF,ZF,PF的状态。

AND AL,01H AND AX,BX OR BYTEPTR AVL,80H TEST AL,08H NOT BX

(AX)=5555H,(BX)=0FF00H,AVL--〉09H TEST指令和AND指令的区别:TEST指令只影响标志位,不影响原目的操作数的值。

逻辑运算指令可以通过选用不同的源操作数的各位代码,使目的操作数的某些位置位、清零和测试目的操作数的某些位。 OR CL,03H AND AL,0F5H XOR AH,0FH TEST AL,02H JZ ZER XOR AL,TEXT_CODE JZ PROC1

4.2.4 移位指令和循环移位指令

SHR DST,CNT SHL/SAL DST,CNT SAR DST,CNT ROR DST,CNT ROL DST,CNT RCR DST,CNT

15

汇编语言程序设计基本方法

RCL DST,CNT 功能:将DST所指出的操作数的各位左移或右移若干位,移位的次数由CNT确定。

DST:除立即数外的各种寻址方式,但不能是段寄存器。CNT可以是立即数或寄存器CL。为立即数时,只能为1。 左移指令:

右移指令:

对标志的影响:对AF无影响,循环移位只影响CF和OF,(可能影响ZF,但无意义)。

只有CNT=1时,OF有意义,当操作数的最高位在移位前后不发生变化OF=0,否则OF=1。 例如: SHR AX,1 SAL AL,CL ROL SAT1[SI],CL

例如:将两位组合BCD码转换成ASCII码,并存放在制定单元: BCD在AL中 MOV SI,0 MOV BL,AL AND AL,0FH ADD A,30H MOV BUF[SI],AL MOV CL,04 SHR BL,CL ADD BL,30H INC SI MOV BUF[SI],BL BUF DB 2 DUP(?)

4.2.5 处理器控制指令与标志处理指令

CLC 0→CF STC 1→CF CMC CF取反 CLD 0→DF STD 1→DF CLI 0→IF STI 1→IF NOP 空操作 HLT 暂停 WAIT 等待 LOCK 总线锁定前置

16

汇编语言程序设计基本方法

ESC 外部设备换码

1. NOP指令

占用机器的3个周期 2. HLT指令

① CPU的复位输入端RESET线上有复位信号 ② 非屏蔽中断请求输入端NMI线上出现请求信号

③ 可屏蔽中断输入端INTR线上出现请求信号且标志寄存器的中断标志IF=1。

17

汇编语言程序设计基本方法

4.3汇编语言程序设计的基本方法

4.3.1 汇编语言程序设计的基本步骤

1. 分析问题 2. 确定算法 算法:

算法描述:自然语言、类程序设计语言或流程图(本书采用) (1) 起始和终止框 (2) 执行框 (3) 判断框 (4) 连接符 3. 编写程序

(1) 了解所用CPU的编程模型、指令系统、寻址方式及有关指令 (2) 进行存储空间和工作单元的合理分配 (3) 子程序和宏指令

(4) 用标号或变量来代替绝对地址和常数

4. 程序的校验 5. 编写说明文件 4.3.2 IBM PC 汇编语言源程序的完整结构及伪指令

1. 段定义伪指令

格式:段名 SEGMENT [定位类型][组合类型][‘类别’] 段名 ENDS (1) 段名

段名:所定义的段的名称,具有:段地址、偏移地址、定位类型、组合类型和类别等属性。 (2) 定位类型

定位类型:对段的起始边界的要求,类型有PAGE、PARA、WORD、BYTE。

PAGE=XXXX XXXX XXXX 0000 0000(页) PARA=XXXX XXXX XXXX XXXX 0000(节) WORD=XXXX XXXX XXXX XXXX XXX0(字) BYTE=XXXX XXXX XXXX XXXX XXXX(字节) PAGE: 段起始地址的低8位是0,其值能被256整除(称为页边界)。 PARA: 段起始地址的低4位是0,其值能被l 6整除(称为段边界)。此方式为系统的隐合定位方式,

WORD:段起始地址的最低位是0,其值能被2整除(称为字边界)一偶地址。

BYTE:段起始地址是任意值。

定义类型的默认段为PARA类型。

18

汇编语言程序设计基本方法

3.组台类型

为连接程序提供此段与其他段之间关系的信息.共有六种选择。 NONE: 系统隐含连接方式,表示此段与其他段没有逻辑上的联系,每段多有自己的基址。 PUBLIC:指示连接程序把此段与其他同名同类别的段连接起来.形成一个物理段.公用一个段的起始地址。连接顺序由连接程序决定。 STACK:表示此段是堆栈段,连接方式同PUBLIC,源程序至少要有一个堆栈段。连接后的段起始地址在SS寄存器中.否则提示错误。通常,寄存器SS指向第一个遇到的堆栈段。

COMMON:表示此段与其他同名同类别的段共用同一个段起始地址,使这些段相互重叠,段的长度取最长段的长度。

MEMORY:表示此段在连接时定位在其他所有段之上(高地址处)。对于多个MEMORY段.汇编程序将把第一个段认为是MEMORY.其余为COMMON。

AT表达式:表示此段定位在表达式值指定的段地址处。

(4)类别

凡是类别名相同的段校先后顺序连接起来时.组成一个段组.共用同一个类别名。类别名必须用单引号括起来,例如,?CODE’、?DATA’、‘STACK’。

STACK SEGMENT

STACK ENDS DATA SEGMENT

DATA ENDS DATA1 SEGMENT

DATA1 ENDS

CODE SEGMENT

CODE ENDS

END 例如: TITLE ADDING PAGE 60,70 STACK SEGMENT PARA STACK ?STACK? TOP LABEL WORD STACK ENDS DATA SEGMENT ADR1 DB 54H,76H,12H,00H DB 21H,98H,04H,00H

19

汇编语言程序设计基本方法

ADR2 DW 4 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV SP,OFFSET TOP MOV DI,OFFSET TOP MOV AX,4[DI] ADD AX,[DI] MOV ADR2,AX MOV AX,6[DI] ADC AX,2[DI] MOV ADR2+2,AX MOV AH,4CH INT 21H CODE ENDS END START 2. ASSUME伪指令

格式:ASSUME 段寄存器:名称[,段寄存器:名称,。。。] 段寄存器:CS、DS、ES、SS 名称:

(1) 由SEGMENT伪指令定义的段名 (2) 表达式:SEG变量名或SEG标号 (3) GROUP伪指令定义的段组名

ASSUME伪指令是使源程序中段与段寄存器发生联系

3. END

格式:ENDS 表达式

表达式:该程序运行时的启动地址,是一条可执行语句的标号

4. ORG

格式:ORG 表达式(2字节的无符号数)

功能:指明该语句下面的程序在段内的起始地址 5. “=”伪指令和EQU指令 (1)“=”指令 格式:名称=表达式

表达式:整型常量、包含两个字符的常量、已定义的符号常量、一个由运算符构成的表达式

20

汇编语言程序设计基本方法

JB :无符号数 JL :带符号数 MOV AX,VAL1 MOV BX,VAL2 CMP AX,BX

VAL1=003AH VAL2=8003H OF DF IF TF SF ZF AF PF CF 1 1 0 X 0 X 0 X 1 VAL1与VAL2位无符号数,应用JB来判断,用CF标志 VAL1与VAL2为有符号数,应用JL来判断,用SF和OF异或的结果。

2) 测试标志

3) 标志位的影响

例如:MOV AX,[SI]指令不影响ZF标志。

4) 指令的多种表示方式 JB SM JNAE SM JC SM

3. 分支程序设计

分支程序设计的要点:

(1)正确选择判定条件和相应的条件转移指令 (3)每条分支都有完整的结果 (4)检查和测试每一条分支

例如:求X的绝对值,并送回原处。

?X,X?0 F????X,X?0 SEGMENT STACK DW 256 DUP(?) LABEL WORD ENDS SEGMENT DW 3456H,8192H ENDS SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK MOV AX,DATA

26

STACK

TOP STACK DATA XADR DATA CODE START:

汇编语言程序设计基本方法

MOV AX,XADR AND AX,AX JNS DONE NEG AX MOV XADR,AX DONE: MOV AH,4CH INT 21H CODE ENDS END START 也可以改成:

AND AX,AX JS NEGX JMP SHORT DONE NEGX: NEG AX MOV XADR,AX DONE: MOV AH,4CH INT 21H

例如4。3。4:写出将一位十六进制数转换成对应的ASCII码的程序(大写字母) 包括0—9和A—F六个字母。0—9转换成ASCII码只要加30H即可,A—F必须加上37H才行。给定一个数后,现判断他的范围,再转换。程序和框图如下:

27

汇编语言程序设计基本方法

28

汇编语言程序设计基本方法

4。3。5 循环程序

例如:将5个数从内存的某个区域移到另一个区域 程序如下:

1. 循环程序的基本结构 (1) 循环准备部分 (2) 循环工作部分 (3) 调整部分

(4) 循环出口部分

2. 循环控制命令

指令的寻址方式为相对寻址方式。相对位移量为8位,寻址范围为-128—127。OPR为语句标号或语句标号加常量表达式。

指令的功能和应用:

(1) 将ADRS开始的100个数据送到ADRD,假设段地址为DS和ES

LEA SI,ADRS LEA DI,ADRD MOV CX,100

AGAIN:MOV AL,[SI] MOV ES:[DI],AL INC SI INC DI LOOP AGAIN

(2) 最多传送100个字节,以‘#’结束传送。

LEA SI,ADRS LEA DI,ADRD MOV CX,100

AGAIN: MOV AL,[SI]

CMP A,?#? JE/JZ PEND

29

汇编语言程序设计基本方法

MOV ES:[DI],AL INC SI INC DI

MOV AL,[SI] LOOP AGAIN

PEND:

3. 循环程序设计

(1) 根据问题确定循环工作部分 (2) 确定循环的调整部分 (3) 确定循环的出口

例4.3.6:求某数组中负数的个数。

30

汇编语言程序设计基本方法

例4.3.8求一字符串的长度,并要求滤去第一个非空格字符前的所有空格。字符串以‘#’结束。

31

汇编语言程序设计基本方法

32

汇编语言程序设计基本方法

4.3.5 子程序及过程定义

1. 调用与返回指令

1) 调用指令CALL

子程序入口地址的寻址方式与无条件转移指令的转向地址的寻址方式基本相同

(1) 段内直接调用指令CALL OPR,OPR为子程序名(过程名),代

表了子程序的入口地址,相对寻址方式,相对位移量:16位,入口地址与返回地址的差值。

(2) 段内间接调用指令CALL OPR1。OPR1:存放子程序入口地址的

单元,

(3) 段间直接调用指令CALL FAR PTR OPR 。OPR为过程名,代表

子程序入口地址的段地址和偏移地址

(4) 段间间接调用指令CALL OPR1。OPR1:32位段地址和偏移量

的内存单元入口。

过程名:SEARCH1 PMOVE 变量:SADR

0400H:0100H CALL SEARCH1 0400H:0103H

0400H:0220H CALL FAR PTR PMOVE 0400H:0225H

CALL BX

CALL WORD PTR [BX] CALL SADR

2) 返回指令RET

功能:从堆栈弹出返回地址送入IP或送入IP和CS。寻址方式:以SP间接寻址。

分段内返回RET和段间返回RETF。RET:2字节到IP,SP+2-》SP;RETF:SP-》IP SP+2-》CS RET N

2. 过程定义 定义格式: 过程名 PROC [类型] RET 过程名 ENDP

(1) 过程名具有与语句标号相同的属性:段地址、偏移量和类型。 (2) 类型:NEAR和FAR (3) PROC和ENDP关键字 (4) RET是过程的返回指令

33

汇编语言程序设计基本方法

3. 主程序与子程序之间的参数传递 子程序入口参数: 子程序出口参数:

1) 寄存器传递参数方式

2) 指定内存单元传递参数方式

3) 堆栈传递参数

4. 子程序说明文件 5. 子程序的嵌套

6. 子程序的递归和可再入性

7. 子程序举例

例4.3.16写一子程序,将16位二进制数转换成十进制数并送显示器显示.

34

汇编语言程序设计基本方法

4.3.6 DOS系统功能调用

DOS系统功能调用主要由软中断指令INT21H实现 4.3.7 字符串处理

1. 字符串操作指令

字符串操作命令的寻址方式是隐含的,如果指令中所处理的字符串在内存,那么源操作数的地址由DS:SI指定,目的操作数的地址由ES:DI指定;如果指令中所处理的字符串的字符在寄存器中,那么寄存器一定是累加器AX或AL。

1) 字符串传送指令MOVS

功能:将由DS:SI所指出的源串传送给由ES:DI所指出的目的串,并修正指针SI和DI,对标志位无影响。 例如; LENG DW 10 DAT1 DW 10 DUP(?) DAT2 DW 20 DUP(?) CLD MOV AX,SEG DAT1 MOV DS,AX MOV ES,AX LEA SI,DAT1 LEA DI,DAT2 MOV CX,LENG AGAIN: MOVSW LOOP AGAIN 说明: MOVSW : MOVS DAT2,DAT1 (SI)=(SI)+2 (DI)=(DI)+2 2) 字符串比较指令CMPS

35

汇编语言程序设计基本方法

(1) U

(2) U 地址

(3) U 地址1 地址2 4. 设置断点并启动运行 G

G=地址

G=地址1,地址2

5. 显示并修改内存单元内容 (1) 显示内存单元的内容

D 段地址:偏移地址

D 段地址:偏移地址1 偏移地址2 (2) 修改内存单元的内容

F 段地址:偏移地址

F 段地址:偏移地址1 偏移地址2

4.5.2 程序调试举例

41

汇编语言程序设计基本方法

第五章 微处理器8086的总线结构和时序

微处理器级总线:微处理器的引脚

系统总线:微处理器通过微处理器级总线和其它逻辑电路连接组成主板系统,形成系统级总线。

微处理器级总线和系统总线之间的接口逻辑电路称为总线控制逻辑。8086CPU通过总线

对存储器或I/O接口进行一次访问所需的时间称为一个总线周期,基本的总线周期包括4个时钟周期。

6.1 8086系统总线结构

8086微处理器有40条引脚,采用分时复用的地址/数据总线。8086有最小和最大两种工作方式。

最小方式:由单微处理器组成最小系统,8086CPU直接产生全部控制信号

最大方式:用于多处理器系统,8086 CPU 不直接提供用于存储器或I/O读写命令等控制信号,仅输出3个状态位,由8288产生控制信号。 6.1.1 两种工作方式公用引脚定义

1. 地址/数据总线 8086CPU 由20条地址总线,16条数据总线。分时复用。 AD15---AD0(输入/输出,三态):地址/数据

A19/S6、A18/S5、A17/S4、A16/S3(输出,三态):地址/控制信号 T1:输出A19—A16。其它时间输出状态。 S4 S3 段寄存器 0 0 ES 0 1 SS 1 0 CS(或I/O,终端响应) 1 1 DS

42

汇编语言程序设计基本方法

为了保存地址,必须有一个地质锁存器。

2. 控制总线(16条引脚)

1) MN/MX(输入)

工作方式,接高电平(+5V)处于最小方式,接地处于最大方式。 2) RD(输出,三态) 读信号,低电平有效。 3) NMI(输入)

非屏蔽中断请求输入信号,上升沿有效 4) INTR(输入)

可屏蔽中断请求输入信号,高电平有效 5) RESET(输入)

系统复位信号,至少保持4个周期的高电平。RESET后,CPU清除IP、DS、ES、SS、标志寄存器和指令队列为0及CS=0FFFFH。CPU从存储器的0FFFF0H单元开始读取和执行指令。

6) READY(输入)

应答信号,高电平有效。 7) TEST(输入)

43

汇编语言程序设计基本方法

8) BHE/S7(输出,三态)

是一个分时复用引脚。在T1状态输出BHE,其他状态输出S7。 BHE A0 操 作 使用数据引脚 0 0 AD15….AD0 读写偶地址的一个字 AD7….AD0 读写偶地址的一个字节 1 0 AD15…AD8 读写奇地址的一个字节 0 1 0 1 AD15..AD8 读写奇地址的一个字 第一个总线周期放低位数据字节 1 0 AD7..AD0 第二个总线周期放高位数据字节

6.1.2 最小方式下引脚定义和系统总线结构

1) INTA(输出)

处理器发向中断控制器的中断相应信号,在相邻的两个总线周期中输出两个负脉冲。

2) ALE(输出)

地质锁存信好,高电平有效。 3) DEN(输出,三态)

数据允许信号,低电平有效。 4) DT/R(输出,三态)

数据收发信号,低电平:CPU收数据,高电平:发数据。 5) M/IO(输出,三态)

高电平:访问存储器,低电平:访问I/O端口。

6) WR(输出,三态)

写信号,低电平有效。

7) HOLD(输入)

总线使用申请信号。

8) HLDA(输出) 总线使用应答信号。 M/IO 0 0 1 1 RD 0 1 0 1 WR 1 0 1 0 传送类型 读I/O端口 写I/O端口 读存储器 写存储器 8284A时钟发生器:时钟电路、复位信号发生电路、准备好信号控制电路。

44

汇编语言程序设计基本方法

8086最小系统:系统总线:地址总线A0—A19、数据总线D0—D15、控制总线(BHE、W/IO、WR、RD、NMI、INTR、HOLD、HLDA、TEST、READY、RESET)

6.1.3 最大方式下引脚定义和系统总线结构

1) QS1、QS0 2) S2,S1,S0 3) LOCK

4) RQ/GT1 RQ/GT0

8086最大系统:地址总线和数据总线与最小方式相同、控制总线:BHE、IORC、IOWC、MRDC、MWTC、LOCK、RQ/GT1、RQ/GT0、INTA、INTR、NMI、TEST、READY、RESET。

6.2 8086系统总线时序

总线周期:8086CPU通过总线对外部进行一次访问所需的时间

T状态:一个总线周期至少包括4个时钟周期T1、T2、T3、T4,处于基本时钟周期的总线状态。

T1状态:BIU把要访问的存储单元或I/O端口的地址输出到总线上。 T2状态:读:T2中使总线处于浮动的高阻状态。在T4从总线读入数据 写:T2—T4把数据输出到总线上。

TW等待周期:8086在总线周期的T3和T4之间插入若干个附加时钟周期。 空闲状态(T1状态):在两个总线周期之间,出现一些没有BIU活动的时钟周期T1的状态。

6.2.1最小方式系统总线周期时序 1. 读总线周期和写总线周期

45

本文来源:https://www.bwwdw.com/article/wpj2.html

Top