汇编基础 第4章3NEW
汇编第四章
4.5 子程序设计 子程序名 PROC [NEAR | FAR] [保护现场] 保护现场] 子程序体 [回复现场] 回复现场] RET 子程序名 ENDP
例如实现回车、换行功能的子程序,过程定义如下: 例如实现回车、换行功能的子程序,过程定义如下: subr proc push ax ;保护现场 push dx 回车控制字符0DH mov dl,0dh ; 回车控制字符0DH mov ah,2 ; int 21h ; 执行回车功能 换行控制字符0AH mov dl,0ah ; 换行控制字符0AH mov ah,2 ; int 21h ; 执行换行功能 pop dx ; 恢复现场 pop ax ret ;子程序返回 subr endp
循环结构的程序通常由3个部分组成: 循环结构的程序通常由3个部分组成: ·循环初始部分——为开始循环准备必要的条件,如循 循环初始部分——为开始循环准备必要的条件, ——为开始循环准备必要的条件 环次数、以及为循环体正常工作而建立的初始状态等。 环次数、以及为循环体正常工作而建立的初始状态等。 ·循环体部分——重复执行的程序代码,这是循环工作 循环体部分——重复执行的程序代码, ——重复执行的程序代码 的主体,它由循环的工作部分及修改部分组成。循环的重 的主体,它由循环的工作部分及修改部分组成。 复部分是为完成程序功能而设计的主要程序段, 复部分是为完成程序功能而设计的主要程序段,循环的修 改部分则是为保证每—次重复时, 改部分则是为保证每—次重复时,参加执行的信息能发生 有规律的变化而建立的程序段。 有规律的变化而建立的程序段。 ·循环控制部分——判断循环条件是否成立,决定是否 循环控制部分——判断循环条件是否成立, ——判断循环条件是否成立 继续循环。 继续循环。
查询结果→english 查询结果
汇编语言程序设计(第四版)第4章【课后答案】
汇编语言程序设计(第四版)第4章【课后答案】汇编语言程序设计第四版【课后习题答案】--囮裑為檤第4章基本汇编语言程序设计〔习题4.1〕例题4.2如果要求算术右移8位,如何修改程序。
〔解答〕思路:首先由最高位字节向次低位字节传送……次低位字节向最低位字节传送(共7次);再判最高位字节符号位,如为0,送00h到最高位字节;如为1,送ffh到最高位字节。
传送可参考例题4.2,不过应从第一号字节送第零号字节,……最高位字节向次低位字节传送;也可以用循环来完成:.model small.stack 256.dataqvar dq 1234567887654321h.code.startupmov cx,7mov si,1again: mov al, byte ptr qvar[si]mov byte ptr qvar[si-1],alinc siloop againtest al,80hjz ezzmov bl,0ffhjmp doneezz: mov bl,0done: mov byte ptr qvar[7],bl.exit 0end〔习题4.2〕例题4.2如果要求算术左移7位,如何用移位指令实现。
〔解答〕思路:可设计外循环体为8个字节左移一次,方法是:最低位字节算术左移一次,次低位字节至最高位字节依次带CF 位循环左移一次(内循环共8次),外循环体控制执行7次即可。
.model small.stack 256.dataqvar dq 1234567887654321h.code.startupmov dx, 7 ;外循环次数mov ax, byte ptr qvar[0] ;最低位字节送axlpp: shl ax, 1 ;最低位字节左移一次,其d7移入CF位mov si, 1mov cx, 7 ;内循环次数again: rcl byte ptr qvar[si], 1 ;高位字节依次左移P50inc siloop againdec dxjnz lpp.exit 0.end〔习题4.3〕将AX寄存器中的16位数连续4位分成一组,共4组,然后把这4组数分别放在AL、BL、CL和DL寄存器中。
汇编语言设计实践:第4部分 基本汇编语言
4.1 汇编语言语句种类及其格式
汇编语言的程序格式
• 完整的汇编语言源程序由段组成,段由指令语句与 伪指令语句构成
• 一个汇编语言源程序可以包含若干个代码段、数据 段、附加段或堆栈段,段与段之间的顺序可随意排 列
• 需独立运行的程序必须包含一个代码段,并指示程 序执行的起始点,一个程序只有一个起始点
• 所有的指令语句必须位于某一个代码段内,伪指令 语句可根据需要位于任一段内或段外
汇编语言的语句可以分为指令语句和伪指令语句
•指令语句——产生使CPU产生动作、可供机器
执行的机器目标代码
•伪指令语句——不产生CPU动作、在程序执行
前由汇编程序处理的说明性语句,例如,数据说明、 变量定义等等
2
一、指令语句
每一条指令语句在汇编时都要产生一个可供CPU执 行的机器目标代码,它又叫可执行语句。
指令语句的一般格式为: 标号 : 操作码
, 操作数
; 注释
一条指令语句最多可以包含4个字段 例 L1:MOV AH,0A0H ;将0A0H放入AH
3
1.标号字段
标号是可选字段,它后面必须有“:”。标号是一条 指令的符号地址,代表了该指令的第一个字节存放 地址。
注释字段可以是一条指令的后面部分,也可以是 整个语句行。
例:
LABEL1: ADD AX,BX; 功能为AX<=(AX)+(BX)
;后面的程序段将完成两次对存储器的访问
MOV AX, W_VAR1
MOV W_VAR2, AX
7
二、伪指令语句
伪指令语句又叫命令语句。 伪指令本身并不产生对应的机器目标代码。它仅 仅是告诉汇编程序对其后面的指令语句和伪指令 语句的操作数应该如何处理。
第四章-汇编语言程序的设计
第四章汇编语言程序设计本章的汇编语言程序设计的主要容有:汇编语言程序设计概述、汇编语言程序的结构形式、汇编语言的伪指令。
(一个单片机应用系统和其它计算机系统一样,在完成一项具体工作的时候,它要按照一定的次序,去执行操作,这些操作实际上就是由设计人员,以单片机能够接受的指令编制的程序,那么无论计算机也好,单片机也好,实际上编制程序的过程,就是用计算机来反映设计者的编程思想,那么这一章中,我们将向大家介绍怎样使用单片机指令系统来编制一些应用程序。
在介绍之前,我们还是来学习汇编语言的一些基础知识)4.1 汇编语言程序设计概述1、计算机的汇编语言以助记符表示的指令,每一条指令就是汇编语言的一条语句。
(汇编语言程序设计实际上就是使用汇编指令来编写计算机程序。
汇编语言的语句有严格的格式要求)2、汇编语言的语句格式MCS-51汇编语言的语句格式表示如下:[<标号>]: <操作码> [<操作数>]; [<注释>]标号:指令的符号地址,有了标号,程序中的其它语句才能访问该语句。
①标号是由1~8个ASCII字符组成,但头一个字符必须是字母,其余字符可以是字母、数字或其它特定字符。
②不能使用汇编语言已经定义了的符号作为标号,如指令助记符、伪指令记忆符以及寄存器的符号名称等。
(同一个标号在程序中只能定义一次,不能重复定义;一条语句可以有标号,也可以没有标号,所以是否有标号,取决于程序中是否需要访问该语句。
)操作码:规定语句执行的操作容,操作码是以指令助记符表示的,是汇编指令格式中唯一不能空缺的部分。
操作数:给指令的操作提供数据或地址。
注释:是对语句或程序段的解释说明。
(在单片机中,这四个部分怎么加以区分呢?使用分界符)分界符(分隔符):用于把语句格式中的各部分隔开,以便于编译程序区分不同的指令段。
冒号(:)用于标号之后空格()用于操作码和操作数之间逗号(,)用于操作数之间,分割两个以上的操作数分号(;)用于注释之前。
汇编语言第4章PPT课件
2. 汇编语言程序设计与执行过程
输入汇编语言源程序(EDIT) 汇编(MASM) 链接(LINK) 调试(TD)
源文件 . ASM 目标文件 .OBJ 可执行文件.EXE 最终程序
4
3. 汇编语言源程序结构
由多个逻辑段组成,包含: 代码段:存放源程序的所有
数据段名 SEGMENT …
数据段名 ENDS
26
一、数据定义伪指令
用途:定义变量类型,给存储器赋初值,或仅给变量分配存储单 元,而不赋予特定的值。
格式: [变量名] DB 操作数;定义字节 [变量名] DW 操作数;定义字 [变量名] DD 操作数;定义双字 [变量名] DQ 操作数;定义8个字节 [变量名] DT 操作数;定义10个字节
操作数——是赋给变量的初始值,可以有一个,也可以有多个, 但不能超出数据类型范围。操作数可以是数值、字 符串、?、或者DUP。
CLC
;CF=0
LPER:MOV AL,DATA2[SI]
ADC DATA1[SI],AL
INC SI
DEC CX
JNZ LPER
MOV AH,4CH
INT 21H
;返回DOS
CODE ENDS
END START
7
二、汇编语言语句类型及格式
1. 汇编语言语句分类
指令性语句
CPU执行的语句, 能够生成目标代码
段 值 变量所在段的段地址 偏移量 变量单元地址与段首地址之
间的位移量。 类 型 字节型、字型和双字型
14
3)表达式
组成:操作数:常量、寄存器名字、存储器操作数 运算符:
算术运算 逻辑运算 关系运算 取值运算和属性运算 其它运算
15
汇编语言学习第4章
不同而不同。
(名字项,常称为标号) 标号是程序设计人员自己定义的表示符号,用来表示本语句的符号地址
(即该指令的偏移地址,也就是该单元与其所处段基址的偏移量)是可有
可无的,只有当需要用符号地址来访问该语句时才需要。 2.operation(操作符)
操作符项可以是指令、伪操作或宏指令的助记符。对于指令,作用是指出
1.等价语句EQU
等价语句的一般使用格式如下: SYMBOL EQU EXPRESSION
作用是用左边的符号名代表右边的表达式。
注意:等价语句不会给符号名分配存储空间,符号名不能与其它符号同名, 也不能被重新定义。
(1)用符号名代表常量或表达式
例4.14 (2)用符号名代表字符串 例4.15 (3)用符号名代表关键字或指令助记符 例4.16
例4.21
2.定义字变量的伪指令为DW
一个变量占一个字空间
例4.22:WORD1 DW DW 89H, 1909H, -1 0ABCDH, ?, 0
上面的定义语句经汇编后所产生出的内存单元分配情况如下:
… 89 00 09 19 FF FF CD AB --00 00 …
例4.23
3.双字变量定义伪指令DD 每个双字变量占用二个连续的字单元(四个字节)。
功能和作用,而不应该只写出指令的动作。
4.2运算符号
4.2.1算术运算符
算术运算符有:+、-、*、/和MOD。 其中: +、-、*、/就是我们算术中常用的加、减、乘、除。 MOD算符是模运算。指除法运算后得到的余数。 例如:5 MOD 2为1。 注意:算术运算符可以用于数字表达式或地址表达式中,但当它用于地址 表达式时,只有当其结果有明确的物理意义时才是有效的。 例如:将两个地址相乘或相除是无意义的。地址可以做加减运算,但也必 须注意物理意义。例如把两个不同段的地址相加减也是无意义的。 例4.1 例4.2
汇编语言程序设计教程第4章
例4.2 在指令中说明内存单元的类型,以便操 作数长度匹配。 MOV [BX],AX 以下指令是错误的: MOV [BX],0 指令改写为: MOV BYTE PTR[BX],0 MOV WORD PTR[BX],0
例4.3 段地址寄存器的传送 MOV AX, DATA_SEG MOV DS, AX 段地址寄存器须通过寄存器得到段地址,不能直接由符号地址、 段寄存器、立即数得到。 以下指令是错误的: MOV DS, DATA_SEG ;段寄存器不接受符号地址 MOV DS, ES ;段寄存器之间不能直接传送 MOV DS, 1234 ;段寄存器不接受立即数 MOV CS, AX ;指令合法,但代码段寄存器不能赋值
短格式:OUT DX,AL (字节) ;0000-FFFFH OUT DX,AX (字) 操作: (DX) ← AL (DX) ← AX 功能:把累加器的数据输出到DX指向的端口。
例4.12 写端口 OUT 61H, AL OUT DX, AL
(3)XLAT换码指令
格式:XLAT 操作:AL←(BX+AL) 功能:把BX+AL的值作为有效地址,取出其 中的一个字节送AL。
(4)XCHG交换指令
格式: XCHG OPR1, OPR2 操作: (OPR1) (OPR2) 功能:把两个操作数互换位置。 遵循双操作数指令的规定,但操作数不能为立 即数。
例4.9 XCHG AX, BX ;两个寄存器长度相等 XCHG AX, [BX] ;AX要求[BX]也取字单元 XCHG AX, VAR ;VAR 必须是字变量 以下指令是错误的: XCHG AX, 5 ;显然操作数不能为立即数 XCHG [BX], VAR ;操作数不能同为内存单元 XCHG AX, BH ;操作数长度要一致
汇编语言程序设计第4章
这条语句指出所定义的CODE代码段到此结束。
9)
END
START
END是保留字,指示整个程序模块到此结束。 按上述格式写出的一个程序如例4-2所示:
第4章 伪指令及汇编语言源程序结构
例4-2 NAME FIRST_DATA STRING_DA FIRST_DATA SIMPLE_EXAMPLE SEGMENT DB 'This is My First Program $' ENDS ;要显示的字符串
令语句的功能相当于若干条指令语句的功能。宏指令语句实际
上是一个指令序列,汇编时产生对应的目标代码序列。
第4章 伪指令及汇编语言源程序结构 注释语句——以分号“;”开始的说明性语句,汇编程序 不予以处理,只起注释作用,使程序易于理解。 空行语句——为保持程序书写清晰,仅包含回车换行符的 语句行。 注意:有关逻辑段的定义和说明伪指令,以及其他伪指令/
80x86系列微处理器的存储器采用了分段管理的方法,其汇
编语言是以逻辑段为基础,按段的概念来组织代码和数据的,
汇编语言源程序的结构特点有:
(1) 由若干逻辑段组成,各逻辑段由伪指令语句定义和说
明。
(2) 整个源程序以END伪指令结束。
第4章 伪指令及汇编语言源程序结构 (3) 每个逻辑段由语句序列组成,各语句可以是: 指令语句——完成一定操作功能,能够翻译成机器代码 的语句,即为第3章介绍的指令所形成的语句。指令语句对应 于CPU指令系统中的一条指令,因此为可执行语句。汇编时汇
是程序名称,用户可用任意一个标识符为程序命名。
第4章 伪指令及汇编语言源程序结构 2) DATA SEGMENT (数据定义伪指令序列) … DATA ENDS
汇编第4章
PAGE NONE(默认) PARA(默认) PUBLIC WORD STACK 在程序中,段名就代表段地址 BYTE
多个’类别’ 连续存放
STACK CODE DATA
汇编伪指令语句
2.指定段寄存器伪指令(assume)
格式: assume 段寄存器:段名[,段寄存器:段名...] 功能:设定段寄存器与段名之间的对应关系。 例如:code segment assume cs:code …. code ends 本例中用assume cs:code将用作代码段的 段code和cpu中的段寄存器cs联系起来 书本p81,更正segment与ends成对出现
end 后 面 的 标 号 start 说 明 了 程 序 的 入 口,cpu的cs:ip将被设置指向这个入口。
段寄存器的装入
DS与ES的装入 ①用ASSUME将DS/ES与相应的段建立联系 ②用数据传送指令mov装入段地址 MOV AX,段名 MOV DS/ES,AX SS的装入(两种办法) 第⑴种:在定义段时,用组合类型STACK说明 STACK1 SEGMENT PARA STACK DW 20H DUP(0) STACK1 ENDS CODE SEGEMNT ASSUME CS:CODE,SS:STACK1 ……
汇编伪指令语句
5.数据定义伪指令(定义变量)
格式:[变量名] DB/DW/DD 初值表 功能:定义一个变量,并给它赋初值。 例如:DATA SEGMENT A DB 0,?,3 B DW 100,1200H,-5 重复次数 C DB ‘A’, ‘XY’ 重复分配操作符 D DW ‘XY’ E DW 3,4466H,2DUP(1,0) 重复数据列表 DW 1123H,0015H 相当于1,0,1,0 F DW C DATA ENDS
汇编课件第4章
通常,段中的数据或指令是按顺序一个接着一个存放的。ORG可以控制数据或代码的偏 移地址,形式为: ORG 功能: 设置其后数据或代码的起始偏移地址为n,设常数表达式的值为n。也就是将地址计 数器的值置为n。 【例】 已知下列数据段,指出变量V1、V2的偏移地址。 data v1 v2 data segment org dw org db ends 200h 1,2 $ + 10h ? ; v1的偏移地址为200h ; 跳过10h个字节 ; v2的偏移地址为214h 常数表达式
指出CSEG、DSEG、ESEG和SSEG分别为代码段、数据段、附加段和堆栈段。 通常,访问的数据在DS所指的数据段或SS所指的堆栈段,而所有的代码引用(如转 移等)相对于当前代码段。那么,汇编器如何知道哪个段是代码段、哪个是数据段呢? 实际上,数据段之所以成为数据段,是由于DS指向它。由于程序运行时可以改变DS 的值,使得任何段都可以成为数据段。因此,当程序定义一个段后,需要告诉汇编器该 段的段地址在哪个段寄存器中。ASSUME就提供这种信息。
4.3 基本伪指令
4.变量定义伪指令
(4)MASM是强类型的。变量在定义后,其类型便被确定,使用时要注意类型匹配。例如: OP1 OP2 DB DW ?, ? ?, ?
下列两条指令执行不同类型的操作: MOV MOV OP1 + 1, 0 OP2 + 2, 0 ; 字节操作指令,将0作为1个字节送到地址OP1 + 1 ; 字操作指令,将0作为1个字送到地址OP2 + 2
4.3 基本伪指令
4.变量定义伪指令
说明: (1)变量可以定义在任何段(包括代码段),但一般定义在数据段。 (2)用DW/DD/DQ/DF/DT定义的数据在内存按“低字节在低地址”的方式存放。例 如: S1 S2 DB DW 'AB' 'AB' ; 等价于 S1 DB 41H, 42H ; 等价于 S2 DW 4142H
第四章 汇编语言程序设计基础
4.2.2 分支程序的设计方法 ★条件控制 ★逻辑尺控制 ★地址跳转表控制
1. 条件控制——利用比较和条件转移指令实现分支,是最常用的 程序设计方法。
பைடு நூலகம்
例如,求解函数:
练习题2. 编写程序,比较两个字符串STRING1和STRING2所 含字符是否完全相同,若相同则显示“MATCH”,若不同则显示 “NO MATCH”。 答案: datarea segment string1 db ‘asfioa’ ;定义字符串STRING1 string2 db ‘xcviyoaf’ ;定义字符串STRING2 mess1 db ‘MATCH’,’$’ ;定义显示字串“MATCH” mess2 db ‘NO MATCH’,’$’ ;定义显示字串“NO MATCH” datarea ends prognam segment main proc far assume cs:prognam,ds:datarea start: push ds ;将ds:00入栈 sub ax,ax push ax mov ax,datarea ;装填数据段及附加段 mov ds,ax mov es,ax
程序流程图
mov ch,4 rotate: mov cl, 4 rol bx,cl mov al,bl and al,0fh add al,30h ;’0’-’9’ ASCII 30H-39H cmp al,3ah jl printit add al,7h ;’A’-’F’ ASCII 41H-46H printit: mov dl,al mov ah,2 int 21h dec ch jnz rotate
例4.3 将首地址为A的N字数组按照从小到大的次序整序(气 泡算法,多重循环) A dw 32,85,16,15, 8
汇编语言第4章汇编语言
4 8 汇编语言第4章汇编语言
10
近类型 (NEAR)
-1
远类型 (FAR)
-2
2. 操作符
操作符可以是指令助记符, 伪指令助记符, 宏指令符号。
3. 操作数
操作数是操作符操作的对象,可以是数据 本身,也可以是标号、寄存器名或算术表达式。
4. 注释
注释是对指令功能的说明,目的实施自 己或他人在阅读分析程序是方便。
第四章 汇编语言
4.1 汇编语句格式 4.2 汇编语言中数据的表示方法 4.3 运算符号 4.4 伪指令 4.5 汇编语言的上机过程
汇编语言第4章汇编语言
4.1 汇编语句格式
4.1.1 字符集 4.1.2 汇编语句格式
汇编语言第4章汇编语言
4.1.1 字符集
Microsoft的宏汇编语言由下列字符组成: (1)英文字母:A~Z和a~z。 (2)数字字符:0~9。 (3)算术运算符:+,-,*,/。 (4)关系运算符:<,=,>。 (5)分隔符:,,:,;,(,),[,], (空格),TAB(制表符)。 (6)控制符:CR(回车),LF(换行),FF(换页)。 (7)其它字符:$,&,_(下划线),.,@,%,!。
SIZE LAB= (L汇E编N语G言T第H4章汇L编A语B言) * (TYPE LAB)
4.3.5 组合算符
1. PTR 用来建立或临时改变存储器操作数的类型。 2. THIS 用来为一个标号建立一个新的类型。
MOV [BX],10H MOV BYTE PTR[BX],10H MOV WORD PTR[BX],10H A1 DB 10H,20H MOV AX,A1 MOV AX,WORD PTR A1 B1 EQU THIS WORD A2 DB 21H,34H MOV AX,B1
汇编第4章
4.2 伪操作 由于ASSUME伪操作只是指定某个段分配给哪一个段寄 存器,它并不能把段地址装入段寄存器中,所以在代码 段中,还必须把段地址装入相应的段寄存器中。代码段 不需要这样做。代码段的这一操作是在程序初始化时完 成的。 为了对段定义作进一步地控制,SEGMENT伪操作还可 以增加类型及属性的说明,其格式如下:
4.2 伪操作 4.2.3 程序开始和结束伪操作 表示源程序结束的伪操作的格式为: END [label] 其中标号(label)指示程序开始执行的起始地址。如果多个 (label) 程序模块相连接,则只有主程序要使用标号,其他子程 序模块则只用END而不必指定标号。 MASM6.0版增加了定义程序的入口点和出口点的伪操作。 .STARTUP 用来定义程序的初始入口点,并且产生设置 DS,SS和SP的代码。如果程序使用了.STARTUP,则结 束程序的END伪操作中不必再指定程序的入口点标号。
4.2 伪操作 (2)组合类型(combine_type)说明程序连接时的段合并方法, 它们可以是: PRIVATE 该段为私有段,在连接时将不与其他模块中 的同名分段合并。 PUBLIC 该段连接时可以把不同模块中的同名段相连接 而形成一个段,其连接次序由连接命令指定。每一分段 都从小段的边界开始,因此各模块的原有段之间可能存 在小于16字节的间隙。 COMMON 该段在连接时可以把不同模块中的同名段重 叠而形成一个段,由于各同名分段有相同的起始地址, 所以会产生覆盖。COMMON的连接长度是各分段中的最 大长度。重叠部分的内容取决于排列在最后一段的内容。
4.2 伪操作 (2)简化的段定义伪操作 汇编程序给出的标准段有下列几种: Code Initialized data Uninitialized data Far initialized data Far uninitialized data Constants Stack 代码段 初始化数据段 未初始化数据段 远初始化数据段 远未初始化数据段 常数段 堆栈段
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本节先介绍80x86的寻址方式,然后着重介绍用于运行应用程 2 序的80x86指令。
4.3.1 80x86寻址方式
指令中的寻址CPU中,8086和80286的字长是16 位,一般情况下只处理8位和16位操作数,只 是在乘、除指令中才会有32位操作数 。
17
【例4-4】 如右图所示,一维数组ARY存 放在主存的数据段中,数组的每个元素 长度相同且都占2个字节单元。从数组 的首址起依次存放各数组元素ARY(0)、 ARY(1)、ARY(2)…、ARY(i)、…。传 送指令: MOV AX,ARY[SI] 可用来访问数组中的元素,指令中的符 号地址ARY指向该数组的首址;变址寄 存器SI的内容表示所访问元素与数组首 址之间的字节距离,则所访问元素的有 效地址: EA= ARY的偏移地址+( SI) 当SI内容为0时,将访问ARY(0)元素; SI内容为1*2时访问ARY(1)元素;SI 内容为 i*2时访问ARY(i),即通过修 改SI的内容可以访问数组中任何一个元 素。 右图给出了访问数组元素ARY(2) 的寻址过程。
寄存器相对寻址方式常用来访问顺序存放在主存中的一维数 组、表、字符串等。其典型用法是将指令中不能修改的位移量作 为基准地址,而将变址或基址寄存器内容作为修改量。例如数组 的起始单元位置是固定的,因此由指令中的位移量给出;而被访 问的数组元素相对其起始单元的距离由变址或基址寄存器提供, 通过修改寄存器的内容就可以访问数组中不同的元素。
7
2.存储器寻址方式
在汇编语言程序中,一个存储单元的地址采用逻辑地址来 表示,其形式为:
段基值(或选段择器):偏移地址
操作数地址(物理地址)是根据段基值(或段选择器)和 偏移地址通过一定的方法得到。段基址在实模式下可从不同的 途径取得。偏移地址是指存放操作数的存储单元与段起始地址 (段基址)之间的字节距离。在80x86里,把按寻址方式计算 出来的操作数偏移地址称为有效地址EA(Effective Address)。
16
在汇编指令中,位移量部分可用数值表示,也可用符号地址 表示(此时用符号地址的偏移地址作为位移量),其寻址方式的 使用格式如下:
MOV AX,10H[SI];位移量为8位常数,EA=10H+(SI),默认段寄存器DS MOV TAB1[BP],CL;位移量为符号地址TAB1的16位偏移地址, 默认段寄存器是SS
4.I/O寻址方式(I/OAddressing)
22
② 用符号地址表示EA 在源程序中,常用符号地址表示存放操作数的存储单元 ,因此在汇编指令中,可用符号地址表示的直接寻址方式来 存取操作数。 操作数如果存放在数据段中,则指令中不必给出数据段寄 存器名(即默认使用DS);如果操作数不是存放在数据段中, 则必须给出段寄存器名。例如:
MOV BX,VAR ;将VAR指向的字单元内容送到BX中 MOV DA_BYTE,0FH ;将立即数0FH置入DA_BYTE指向的字节单元 MOV CL,DA+3 ;把由DA地址偏移3个字节的字节单元内容送到CL中
计算机组成原理与汇编语言程序设计
(第2版)
徐 洁 俸远桢 主编
第 4 章(3)
1
4.3 80x86 CPU的指令系统
80x86 CPU的指令集是在8086/8088 CPU的指令系统上发展 起来的。8086/8088 指令系统是基本指令集,80286、80386、 80486和Pentium指令系统是在基本指令集上进行了扩充。扩充 指令的一部分是增强的8086/8088基本指令和一些专用指令;另 一部分是系统控制指令,即特权指令,它们对80286、80386、 80486和Pentium保护模式的多任务、存储器管理和保护机制提 供了控制能力。 80x86 CPU采用了变字长的机器指令格式,由1~15个字节 组成一条指令(8086 最长6个字节)。一般格式如下图所示:
19
基址变址寻址方式的位移量可用数值或符号地址表示,其 使用格式如下:
MOV AX,200H[BX][SI];位移量为16位常数, EA=200H+(BX)+(SI),默认段寄存器为DS MOV AX,ARRAY[BP][SI];位移量为符号地址ARRAY的16位 偏移地址,默认段寄存器为SS MOV [BP][DI],DL;位移量为0,EA=(BP)+(DI), 默认段寄存器为SS
指令所需的操作数在存储单元中,操作数的有效地址EA 是两个地址分量之和:基址寄存器(或变址寄存器)的内容 与指令中指定的位移量之和。这种寻址方式如下图所示 :
这种寻址方式若使用的是变址寄存器称为变址寻址方式;若使 用的是基址寄存器称为基址寻址方式。它所允许使用的寄存器及 与其对应的默认段情况与寄存器间接寻址方式中所说明的相同。
8
存储器操作数的寻址方式不同,则形成有效地址EA 的方法就不同。有效地址EA可以由4个地址分量的某种组 合求得,它们分别是: ① 位移量 它是指令代码中的一个8位、16位或32位二进 制数,但它不是立即数,而是一个地址量。在源程序中, 位移量通常以符号地址(变量名或标号)的形式出现,也 可以是常数,经汇编后,这些符号地址的偏移地址或常数 就转换为指令代码中的位移量。 ② 基地址 即基址寄存器或基址指针的内容。 ③ 变址量 即变址寄存器的内容。
11
① 用数值地址表示EA 在采用直接寻址方式 的汇编指令中,如用数值 表示操作数的有效地址, 则操作数所在段的段寄存 器必须指明,不能省略。 例如,传送指令源操 作数的有效地址用数值地 址表示: MOV BX,DS:[ 1000H ]
这条指令完成将当前数据段偏移1000H个字节的字单元内容 1234H送入BX中,如上图所示,其中源操作数的有效地址 12 EA是1000H。
10
对不同的存储器寻址方式,构成其有效地址EA的地址分量 是不同的,但这些寻址方式的有效地址的计算都可以用下式表示: EA= 基地址 +变址量 +位移量 上式中的每一个地址分量均可空缺。
下面具体讨论6种存储器寻址方式。 (1)直接寻址方式(Direct Addressing)
直接寻址是指指令所需的操作数存放在存储单元中,操作数 的有效地址EA直接由指令代码中的位移量提供,即EA只包含位移 量这一种地址分量。此时,位移量的值就是操作数的有效地址, 如下图所示:
9
8086/80286只能使用16位寻址,而80386及其后继机型则既可用 32位寻址,也可用16位寻址。在这两种情况下,对以上4个地址分 量的组成有不同的规定,如下表所示: 16/32位寻址时有效地址4种分量的组成
地址分量 位移量 基址寄存器 变址寄存器 16位寻址 0,8,16位 BX,BP SI,DI 32位寻址 0,8,32位 任何32位通用寄存器(包括ESP) 除ESP以外的32位通用寄存器
6
【例4-2】 指令“MOV AX,BX”的源和目的操作数都采 用寄存器寻址方式,该指令完成将BX中的内容送到AX中。 如指令执行前(AX) 3064H,(BX) 1234H;则指 令执行后,(AX) 1234H,(BX)保持不变。
【例4-3】 MOV BL,AL;将AL中的内容送到BL中 MOV DS,AX
MOV MOV MOV MOV MOV MOV MOV MOV CH,[SI] [DI],BX AL,[BX] CX,[BP] CH,DS:[SI] DS:[DI],BX AL,DS:[BX] CX,SS:[BP]
上述指令分别等价于:
15
(3)寄存器相对寻址方式(Register Relative Addressing)(也称变址寻址方式或基址寻址方式)
由于基址变址寻址方式中有两个地址分量可以在程序执行过 程中进行修改,因此常用来访问存放在主存中的二维数组。
20
【例4-8】 如右图所示, ARRAY数组是10行、10列的二维 数组,按行存放在主存堆栈段中。 从数组的首址ARRAY起依次存放 各数组元素:第0行元素为ARRAY (0,0)~ARRAY(0,9)共10 个,第1行元素为ARRAY(1,0) ~ARRAY(1,9),…。每个元 素占用一个字节单元。可以用指令 : MOV AL,ARRAY[BP][SI] 访问数组中的某个元素ARRAY(i, j),指令中的位移量ARRAY指向数 组首址;BP存放被访问行的起始位 置相对数组首址的距离,即i *10;SI 存放被访问数组元素相对本行首址的 距离,即j,则要访问元素的有效地 址: EA ARRAY的偏移地址 +( BP)+( SI),段基值隐含由SS给出。 右上图给出了访问数组第1行第8列元素ARRAY(1,8)的寻址过程 。 21
这种寻址方式实际上是将有效地址事先存放在一个寄存器 中,因此这个寄存器就如同一个地址指针。 14
寄存器寻址方式在16位寻址时可用的寄存器是BX、BP、SI和 DI。凡使用BP时,其默认段为SS段。其他寄存器的默认段为DS 寄存器。 由于用寄存器作为地址指针,因此在程序中只要修改间址 寄存器的内容,就可以用同一条指令访问不同的存储单元。这 种寻址方式的使用格式如下:
3
1.立即寻址方式和寄存器寻址方式 (1)立即寻址方式(Immediate Addressing)
立即数寻址是指指令所需的操作数直接在指令代码中, 随着取指令一起取到CPU中。这种操作数称为立即数。立 即数可以是8位或16位的。 这种寻址方式如下图所示:
4
立即数用来表示常数,它经常用于给寄存器赋初值,并且 只能用于源操作数字段,不能用于目的操作数字段,且源操作 数长度应与目的操作数长度一致。在汇编指令中,立即数若是 数值常数可直接书写,若是字符常数则应加上引号。 【例4-1】 MOV MOV MOV 下述汇编指令的源操作数都采用立即寻址方式。 AL,5 ;将8位立即数05H送入AL中 AX,0B064H BX," AB "
上述3条指令分别等价于:
MOV BX,DS:VAR MOV DS:DA_BYTE,0FH MOV CL,DS:DA+3