null第4章 寻址方式与指令系统第4章 寻址方式与指令系统 本章主要内容本章主要内容1. 数据寻址方式
2. 转移地址寻址方式
3. 8086 指令系统及编程应用举例
4. 指令编码
格式
pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载
4.1 寻址方式4.1 寻址方式4.1.1 8086/8088 的寻址方式
1. 寻址方式概述 寻址方式 寻址方式定义 :指令中如何提供操作数或操作数地址的方式称为寻址方式。
[
规定
关于下班后关闭电源的规定党章中关于入党时间的规定公务员考核规定下载规定办法文件下载宁波关于闷顶的规定
如何对地址字段作出解释以找到操作数]
* 程序转移时需提供转移地址,这跟提供操作数地址在方法上没有本质区别,因此也归入寻址方式的范畴。
null一个指令系统能够提供哪些寻址方式,能否为编制程序提供方便,这是指令系统设计的关键。
需要说明的是,在不同的计算机系统中,寻址方式的名称和分类并不统一,但基本可以归结为以下几种方式或它们的变型或组合:寻址方式的名称和分类寻址方式的名称和分类立即寻址(立即数寻址)
寄存器寻址
直接寻址
间接寻址
变址寻址
例如,Z80系统:
立即寻址 ;直接寻址
立即扩展寻址;零页寻址
隐含寻址;相对寻址
寄存器寻址;变址寻址
寄存器间接寻址;位寻址null两类寻址方式
数据寻址方式
转移地址寻址方式
(重点讨论数据的寻址方式)
2. 数据寻址方式2. 数据寻址方式(1) 立即寻址(Immediate addressing)
指令中直接给出操作数,操作数紧跟在操作码之后,作为指令的一部分存放在代码段里,在取出指令的同时也就取出了操作数,立即有操作数可用,所以称之为立即寻址。 目的 源 example 目的 源 example MOV AL, 80H ; 低地址 存储器
AX
MOV AX, 3064H ; 代
码
ADD AL, 20H ; 段
ADD AX, 1090H; 高地址 立即数可以为8位,也可以为16位。如果是16位数,则“高位字节存放在高地址中,低位字节存放在低地址中。”
立即寻址方式常用于给寄存器赋值,并且只能用于源操作数,而不能用于目的操作数。
null下述各条指令源操作数的寻址方式也都是立即寻址,但这些指令都是错误的:
MOV AL, 256 ; 256=100H,超过了AL能存放的数的范围
MOV AX, -32769 ; -32769超过了AX能存放的带符号数(补码)范
围
MOV 100H, AL ; 立即数不能作为目的操作数
DEC 20 ; 单操作数指令不能使用立即数
MOV DS, 1234H ; 源操作数是立即数,则目的操作数就不能是
段寄存器(2)寄存器寻址(Register addressing)(2)寄存器寻址(Register addressing)操作数在寄存器中,指令中指明寄存器号,这种寻址方式叫寄存器寻址。
对于8位操作数,寄存器可以是 AH,AL,BH,BL, CH, CL, DH, DL .
对于16位操作数,寄存器可以是AX, BX,CX, DX, SI, DI, SP ,BP,CS,DS,ES,SS (但CS 不能作目的寄存器)
EXAMPLE EXAMPLE INC AX ; MOV AX, BX ;
DEC AX ; ROL AH , 1 ;
将AH中的内容循环左移一位
null 练习:
MOV AX , BX ;正确。指令执行后,
AX←BX,但BX不变
MOV AX, BL ;错误。源和目的的位数不相同
MOV CS, AX ;错误。CS不能作为目的操作数
MOV ES, DS ;错误。两个操作数不能都是段
寄存器 寄存器寻址的特点 寄存器寻址的特点 (1) 操作数就在寄存器中,不需要访问存储器来取得操作数(指令执行时,操作就在CPU的内部进行),因而执行速度快。
(2)寄存器号比内存地址短
* 在编程中,如有可能,尽量使用这种寻址方式的指令。
* 寄存器寻址方式既可用于源操作数,也可用于目的操作数,还可以两者都用于寄存器寻址方式(如 MOV BX , AX ) 除以上两种寻址方式外,下面各种寻址方式的操作数均在存储器中,通过采用不同的寻址方式取得操作数地址,从而取得操作数。(3)直接寻址(Direct Addressing)(3)直接寻址(Direct Addressing)说明:在讨论寻址方式时,通常把操作数的偏移地址称为有效地址EA (Effective Address) ,EA可通过不同的寻址方式来得到。
在直接寻址方式中,指令中直接给出操作数的有效地址,或者说,有效地址EA就在指令中。它(操作数的有效地址,而不是操作数本身)存放在代码段中指令的操作码之后,但操作数一般存放在数据段中。 例 1. MOV AX , DS:[2000H];
如(DS)= 3000H, 则指令的执行情况如下图所示:
代 存储器 采用直接寻址方式,如果没
码 有用“段跨越前缀”标明操作
段 数在哪一段,就默认段寄存
为DS.
30000H
数 AX
据
段 32000H
执行结果:(AX)=3050H 也允许数据存放在数据段以外的其它段(如附加段)。此时应在指令中给出 “跨越段前缀”。
例 2: 如数据在附加段中,则应指明“段跨越缀” 。
MOV AX , ES : [3000H]
或 ES: MOV AX , [3000H]
* 为了使指令字不要过长,规定双操作数指令不能两个操作数都用直接寻址方式。
如 MOV DS: [2000H] , DS:[3000H] 寄存器间接寻址
(Register indirect Addressing)寄存器间接寻址
(Register indirect Addressing)采用寄存器间接寻址方式时,指令中给 出寄存器号(寄存器为BX,BP,SI和DI之一), 被指定的寄存器中存放着操作数的有效地址,操作数在存储器中(以寄存器的内容为操作数的有效地址)。
(BX) ……..对应段寄存器为 DS
EA= (BP) ……..………………… SS
(SI ) ……………………….. DS
(DI) …………………………DSExampleExampleMOV AX , [BX] ;
设 ( DS) = 2000H ,(BX) = 1000H
物理地址=20000H + 1000H =21000H
*指令中也可以通过
AX ………. “段跨越前缀”取得
数 其他段中的数据,
据 例如:
段 MOV AX,ES: [BX]
21000H
指令的执行结果为:
(AX) = 50A0H(5)寄存器相对寻址(Register relative addressing)(5)寄存器相对寻址(Register relative addressing)操作数的有效地址是一个基址或变址寄存器的内容与指令中指定的8位或16位位移量(Displacement)之和。
如下图所示:null
(BX) 8位位移量
EA = (BP) +
(SI) 16位位移量
(DI)
若没有段跨越前缀,则对于寄存器BX,SI, DI的情况,段寄存器为DS;
对于寄存器为BP的情况,则段寄存器为SS。
ExampleExampleMOV AX, [SI+3000H] 操
设(DS)=4000H,(SI)=2000H 作
物理地址 码=40000H+2000H+3000H 位
= 45000H 移
量
指令的执行情况如
右图 AX 40000H
43000H
SI 数
45000H 据
段 null这种寻址方式可用于
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
格的处理,通过位移量来设置表格的首地址;
利用修改基址寄存器或变址寄存器的内容来获得表项的值。(6)基址变址寻址(Based indexed addressing)(6)基址变址寻址(Based indexed addressing)操作数的有效地址是一个基址寄存器和一个变址寄存器内容之和,两个寄存器均由指令指定。
(BX) (SI) 若基址寄存器为BX,则段寄存器为DS
EA= +
(BP) (DI) 若基址寄存器为BP,则段寄存器为SS
Example Example 例:MOV AX,[BX+DI]
设(DS)=2100H, (BX)=0158H, (DI)=10A5H.
则 EA= 0158H+10A5H=11FDH
物理地址=21000H+11FDH=221FDH
(BX) 21000H
21158H
AX
221FDH
null这种寻址方式同样适用于表格(或数组)的处理,表的首地址可存放在基址寄存器中,而用变址寄存器来访问表格中的各项。
由于两个寄存器都可以修改,使 用起来更灵活。(7 )相对基址加变址寻址(Relative based indexed address~)(7 )相对基址加变址寻址(Relative based indexed address~)也称“带位移量的基址加变址寻址方式”.
操作数的有效地址是一个基址寄存器和一个变址寄存器内容与8位或16位位移量之和。
(BX) (SI) 用BX,则段寄存器为 DS
EA= + + 位移量
(BP) (DI) 用BP,则段寄存器为 SS例:MOV AX,[BX+SI+0250H]例:MOV AX,[BX+SI+0250H]设(DS)=3000H,(BX)=2000H,(SI)=1000H,则 代
EA= 2000H+1000H+0250H=3250H 码
物理地址=30000H+3250H=33250H 段
30000H
位移量
AX 30250H 数
(BX) 32250H 据
(SI) 33250H 段null这种寻址方式可用于访问二维数组。
设数组元素在内存中按行顺序存放(首先放第一行所有元素,再放第二行所有元素,……)。通过改变基址寄存器(如BX)和变址寄存器(如SI)的值可以访问数组中不同行和列上的元素。
若保持BX不变而SI改变,则可以访问同一行的所有元素。
若保持SI不变而BX改变,则可以访问同一列的所有元素。
数据的寻址方式的寻址过程(图示)数据的寻址方式的寻址过程(图示).指令数据寄存器(1)立即寻址数据指令寄存器(2)寄存器寻址图4-1 数据的寻址方式的寻址过程(1)nullEA数据指令存储器(3)直接寻址寄存器EA指令寄存器(4)寄存器间接寻址数据存储器图4-1 数据的寻址方式的寻址过程(2)null数据存储器地址寄存器寄存器指令位移量+EA(5)寄存器相对寻址图4-1 数据的寻址方式的寻址过程(3)null图4-1 数据的寻址方式的寻址过程(4)数据存储器基地址寄存器基址
寄存器指令变址
寄存器+EA(6)基址变址寻址变址值寄存器null图4-1 数据的寻址方式的寻址过程(5)数据存储器基地址寄存器基址
寄存器指令变址
寄存器+EA(7)基址变址相对寻址变址值寄存器位移量3. 转移地址的寻址方式3. 转移地址的寻址方式有关术语和概念:
段内转移—如果转移地址与该转移类指令在同一个代码段,这样的转移称为段内转移,也称近转移;
近转移时的转移地址只包含偏移地址部分,找到转移地址后,将转移地址送入IP即可实现转移(CS的内容不必改变)。
null段间转移—如果转移地址与该转移类指令位于不同的代码段,这样的转移称为段间转移,也称远转移;
远转移时的转移地址既包含偏移地址部分又包含段基值部分,找到转移地址后,将转移地址的段基值部分送入CS,将转移地址的偏移地址部分送入IP即可实现转移。
null直接转移—如果转移地址直接放在指令中,则这样的转移称为直接转移,视转移地址是绝对地址还是相对地址(即地址位移量)又可分别称为绝对转移和相对转移。
间接转移—如果转移地址间接放在其他地方,则这样的转移称为间接转移,视转移地址是在寄存器中还是在存储器中又可分别称为寄存器操作数(寄存器寻址)和存储器操作数(存储器寻址)。
4.1.2 8086/8088 指令系统4.1.2 8086/8088 指令系统可以分为以下六类(四类):
传送指令
算术运算指令
逻辑运算和移位指令 运算类
串操作指令
转移指令
处理器控制指令一、传送指令一、传送指令包括:通用传送指令和专用传送指令两类
通用传送指令:
(1) MOV 指令(1) MOV 指令 立即数存储器直接寻址
寄存器间接寻址
寄存器相对寻址
基址变址寻址
基址变址相对寻址通用寄存器AX BX CX DX
SI DI SP BP
AL BL CL DL
AH BH CH DH段寄存器DS
ES
SSCSnull例: MOV AL, BL
MOV [DI], AX
MOV CX, DS:[1000H]
MOV BL, 40
MOV WORD PTR[SI] , 01H
BYTE PTR 字节长度标记
WORD PTR 字长度标记
DWORD PTR 双字长度标记
标志:所有通用传送指令都不影响标志位。 练习1 练习1用MOV指令实现两内存字节单元内容的交换
2035H
2045Hnull用直接寻址方式实现用直接寻址方式实现 MOV BL, DS:[2035H]
MOV CL, DS:[2045H]
MOV DS:[2045H], BL
MOV DS:[2035H], CL
HLT用寄存器间接寻址方式实现用寄存器间接寻址方式实现 MOV SI , 2035H
MOV DI, 2045H
MOV AH, [SI]
MOV AL, [DI]
MOV DS:[2035H] ,AL
MOV DS:[2045H] ,AH(2)堆栈操作(2)堆栈操作低地址高地址SS段基地址SPSP-1SP-2堆栈段堆栈是一个“后进先出”的存储区,其段基地址存放在SS寄存器中,它只有一个入口,SP寄存器任何时候都指向当前的栈顶。进栈操作 PUSH SRC 例 PUSH AX 2 10 7进
栈
方
向SP=1000H 1000H0FFFH0FFEHnull出栈操作 POP DSC 例 POP BX SP=0FFEH 低地址高地址SS段基地址SPSP+1SP+2堆栈段0 72 1出
栈
方
向0FFEH0FFFH1000H0 72 1null堆栈的存取在16位指令中必须是以字这单位
(不允许字节堆栈)PUSH reg
PUSH mem
PUSH data
PUSH segreg
POP reg
POP mem
POP segreg ;CS除外
(3)XCHG 交换指令(3)XCHG 交换指令两个操作数opr1,opr2必须
有一个为通用寄存器,指令
允许字节操作或字操作.例: XCHG BX,[BP+SI]设(DS)=2000H,(SS)=2F00H,
(BP)=0200H,(SI)=0046HBX 2F00 H+0200 H2F246H0046 H0 4 1 H6 F 3 0代
码
段
CS堆
栈
段
SS存储器2F247H2F000H246H指令执行结果:
(BX)=(6F30H)
(2F246H)=4154H2F246 HTEMP6 F 3 04 1 5 43 0 H6 F H指令执行前:
(BX)=6F30H
(2F246H)
=4154H 练习 练习用XCHG指令改进前面的数据块交换程序:
MOV BL , [SI +09H]
XCHG BL , [DI+09H]
MOV [SI+09H] , BL 2. 专用传送指令2. 专用传送指令专用传送指令有15条,可分为标志传送、查表、地址传送、符号扩展、输入/输出和串传送类共六种,它们的名称、
书
关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf
写格式、完成的操作及操作类型如下表所示。null 专用传送指令 (1)null专用传送指令 (2) 续表null 专用传送指令 (3) 续表null专用传送指令 (4) 续表(1)标志传送指令(1)标志传送指令标志传送指令共4条:
PUSHF
POPF
LAHF ;AH Flag的低8位
SAHF ;Flag的低8位 AH
例:将8086 标志寄存器的TF位置 “1”
(2)查表指令(2)查表指令查表指令XLAT将以BX+AL为偏移地址的内存单元中的一个字节送到AL中。
在使用XLAT指令前,应先在内存中建立一个字节数据表,表的首字节的偏移地址要事先存入BX,表中待查的数据相对于表开始处的位移量也要事先存入AL。
指令执行时,会将BX的内容与AL的内容相加,用得到的数作为偏移地址,以DS为段地址,将该地址处存储单元中的内容(字节)取到AL中。
null 例如,如果B为数据段中一组字节变量的开始地址,则执行下列程序段后,AL=66H。
B DB 3FH, 06H, 5BH, 4FH, 66H ;数据段中的数据表
DB 6DH, 7DH, 07H, 7FH, 6FH
MOV BX,OFFSET B ;使BX中存放数据表首字节的偏移地址
MOV AL,4 ;使AL中存放欲查单元的地址位移量4
XLAT ;查表得到的内容(字节)在AL中
在此例中,数据表中存放的数据恰好是共阳极数码管的输入信号,所以,只要事先在AL中放好一个十进制数码(0~9),就能通过上述程序段得到数码管的相应输入信号。(3) 地址传送指令(3) 地址传送指令地址传送指令有LEA、LDS和LES共3条:
LEA (Load Effective Address)
LDS (Load pointer into register and DS)
LES (Load pointer into register and ES)
null(i)取有效地址指令格式:LEA REG , SRC
操作:REG SRC 的有效地址
*指令功能:
将源操作数的有效地址EA传送到目的操作数,目的操作数为一个16位的通用寄存器。null例:LEA BX , [BX+DI+6H] 若指令执行之前(BX)=1000H, (DI)=0200H, 则指令执行之后, (BX)=1206H
注意与指令MOV BX,[BX+DI+6H]功能上的区别
从变量的角度,“LEA AX,VAR”指令传送的是变量的地址,而“MOV AX,VAR”指令传送的是变量的值。null练习
如果TABLE为数据段中0032H单元的符号名,其中存放的内容为1234H,
当执行指令 “ MOV AX , TABLE”后,
(AX)= ;
而执行指令 “ LEA AX , TABLE”后,
(AX) = 。
null(ii) LDS REG , SRC操作:REG (SRC)
DS (SRC+2)
标志:- - - - - - - - -
指令 功 能:将地址指针(共4个字节)装入DS和另一个非段寄存器。其中:
前两个字节(偏移量) 非段寄存器
后两个字节(段基址) DSnull Example例1. LDS DI , DS:[2130H]
设(DS)=3000H
32130H
DI
DS
null(iii) LES REG , SRC 操作: REG (SRC)
ES (SRC+2)
* LDS和LES指令为切换数据段提供了方便。null堆栈操作及RET n 指令使用举例 在进入子程序FFIT 之前,主程序将字符串的首地址放于堆栈顶部,执行子程序FFIT 时,将字符串首址取到ES和DI 中,并取出要显示的字符,然后调用DISPLAY 子程序进行显示。
主程序: FFIT: DISPLAY:
call FFIT call DISPLAY
ret ? ret 2FFIT子程序段FFIT子程序段 FFIT: PUSH BP
MOV BP, SP
PUSH ES
PUSH DI
LES DI , [BP+04]; 将字符串首址送ES和DI
AAA: ES:MOV AL, [DI]; 从ES和DI所指单元取字符
CMP AL,00 ; 判取出的字符是否为结束符
JZ EEE
PUSH AX ; 通过堆栈为DISPLAY子程序传递参数(要显示的字符)
CALL DISPLAY
INC DI
JMP AAA
EEE: POP DI
POP ES
POP BP
RET ?null堆栈操作及RET n 指令使用举例 DISPLAY 子程序返回地址 AX
DI
ES
sp BP
FFIT 子程序的返回地址
字符串首址偏移量
字符串首址段基值
(4) 符号扩展指令(4) 符号扩展指令符号扩展指令有CBW和CWD共两条。
CBW指令将AL中的8位带符号数扩展为16位并送入AX中。
实际上就是将AL的最高位送入AH的所有各位。
CWD指令将AX中的16位带符号数扩展为32位并送入DX和AX中(其中DX存放高16位,AX存放低16位)。
实际上就是将AX的最高位送入DX的所有各位。nullCBW和CWD两条指令通常只对带符号数使用。
CBW指令只能对AL的内容进行扩展,扩展后AL的内容不变但占用AH;
CWD指令只能对AX的内容进行扩展,扩展后AX的内容不变但占用DX。
null例如:
若AX=379AH, 则执行完CBW指令后,AX=FF9AH,若执行的是CWD指令,则DX=0000H,AX=379A H;
若AX=977AH, 则执行完指令CBW后,AX=007AH,若执行的是CWD指令,则DX=FFFFH,AX=977AH。
(5) 输入输出指令(5) 输入输出指令<1> 直接输入输出指令
格式:IN AL, PORT ;操作:AL (PORT)
IN AX, PORT; AX (PORT+1,PORT)
OUT PORT,AL; (PORT) AL
OUT PORT,AX; (PORT+1,PORT) AX
注:PORT为输入输出端口号,范围为0~255(00~FFH) I/O 接口的基本结构 I/O 接口的基本结构 cpu外 围 设 备 数据输入寄存器数据输出寄存器状态寄存器 控制寄存器中断控制逻辑数据总线地址总线控制总线I/O接口<2>间接输入输出指令<2>间接输入输出指令格式:IN AL, DX; 操作:AL (DX)
IN AX, DX; AX (DX+1,DX)
OUT DX,AL; (DX) AL
OUT DX,AX; (DX+1,DX) AX
在间接输入输出指令之前,需将端口号 DX.
MOV DX,XXXXH;输入输出指令格式(机器码)输入输出指令格式(机器码)输入指令:
0:8位传送 只出现于直接输入
1:16位传送 输出指令
0-直接输入指令(长形)
1-间接输入指令 (短形)
输出指令
只出现于长形…
0 (长形)
1(短形)null输入输出指令的使用IIN 指令:用于从数据端口输入数据或从状态端口输入状 态字.
例: IN AL , 28H; LOP : IN AL, 27H;
MOV DS:[2000H] ,AL; TEST AL,01H;
JNZ LOP
………
nullOOUT指令:用于输出数据或命令给指定的I/O端口
例例1 MOV AL , [SI]
OUT 80H , AL ;设80H为数据口的口地址
例2 MOV DX , 280H;设280H为控制口的口地址
MOV AL , 01H
OUT DX , AL(6) 串传送类指令(6) 串传送类指令串传送类指令有MOVS、STOS 和 LODS共3条。
第一条指令:串传送指令(MOVS)
串传送指令MOVS完成两个存储单元之间的传送,传送后会自动修改有关的变址寄存器。
null“MOVSB”指令将源存储单元(DS:SI)的一个字节传送到目的存储单元(ES:DI)的一个字节中。
若DF=0,则传送后SI←SI+1,DI←DI+1;若DF=1,则传送后SI←SI-1,DI←DI-1。
“MOVSW”指令将源存储单元(DS:SI)的一个字传送到目的存储单元(ES:DI)的一个字中。
若DF=0,则传送后SI←SI+2,DI←DI+2;若 DF=1,则传送后SI←SI-2,DI←DI-2。串传送指令的应用例串传送指令的应用例将内存1000H地址开始的100个字节数据向高地址方向移动一个字节的位置。
null参考
答案
八年级地理上册填图题岩土工程勘察试题省略号的作用及举例应急救援安全知识车间5s试题及答案
参考答案 MOV AX , DS
MOV ES , AX ;set up ES to same as DS
MOV SI , 1063H
MOV DI , 1064H
MOV CX , 64H
STD
REP MOVSB
HLT
思考:向低地址方向移动两个字节位置。
null第二条指令:串存储指令STOS(写串)
串存储指令STOS将累加器AL或AX的内容传送至目的存储单元(ES:DI)中。传送后自动修改DI寄存器的值。
该指令前面加上重复前缀REP后,可以使一段内存单元中填满相同的值。
null第三条指令:串装入指令LODS(读串)
串装入指令LODS将源存储单元( DS:SI)的内容传送至累加器AL或AX中。传送后会自动修改变址寄存器SI的内容。
因为累加器在每次重复时都被重写,只有最后一个元素被保存下来,故这条指令前一般不加重复前缀,而常用在循环程序段中,和其他指令结合起来完成复杂的串操作功能。
二、运算类指令二、运算类指令二进制算术运算指令
BCD数运算指令
逻辑运算和移位指令1. 算术运算指令1. 算术运算指令(1) 二进制加法和减法指令
名称 格式 操作
加法 ADD DST,SRC DST SRC+DST
带进位加法 ADC DST,SRC DST SRC+DST+CF
减法 SUB DST, SRC DST DST-SRC
带借位减法 SBB DST,SRC DST DST-SRC-CF
标志: O D I T S Z A P C 所有状态标志都受影响
×---××××× Example 1 Example 1编写实现下列二进制运算的程序段
W X+Y+24-Z(X,Y,Z均为字变量)
MOV AX, X
ADD AX, Y
ADD AX, 24
SUB AX, Z
MOV W, AX
Example 2 Example 2双倍精度运算(操作数的长度为双字--两个16位)
2000H 3000H
低16位 低16位
高16位 高16位
把2000H地址开始的两个字(低字在前)和3000H地址开始的两个字相加,和存放在2000H开始处。程序段程序段MOV SI , 2000H ;取第一个数的首地址
MOV AX, [SI] ; 将第一个数的低16位送AX
MOV DI ,3000H ; 取第二个数的首地址
ADD AX, [DI] ; 第一个数的低16位和第2个数 的低16位
相加(不加CF,但此条指令的执行影响CF)
MOV [SI],AX ; 存低16位相加结果
MOV AX, [SI+2]
ADC AX,[DI+2] ;两个高16位连同CF(低16位相加形成的)相
加.
MOV [SI+2],AX ; 存高16位相加结果.null思考:
以上是双字(双倍精度)相加,如果更多字(多倍精度)相加,这个程序将如何设计?
例3:例3:假设数的长度(以字计)存放 于2500H字节单元,两个无符号二进制数分别 从2000H和3000H开始存放(低字在前),求两数之和并存放于2000H开始处,试编程实现。参考答案参考答案 MOV CL , DS:[2500H]
MOV SI , 2000H
MOV DI , 3000H
CLC ; 清CF
LOOP1: MOV AX , [SI]
ADC AX , [DI]
MOV [SI] , AX
INC SI
INC SI
INC DI
INC DI
DEC CL
JNZ LOOP1
MOV AX , 0H ;
ADC AX , 0H ; 处理最高位产生的进位
MOV [SI] , AX ;
HLT
(2) 加1 减1和比较指令(2) 加1 减1和比较指令名称 格式 操作
加 1 INC OPR OPR OPR+1
减 1 DEC OPR OPR OPR-1
求补(Negate) NEG OPR OPR -OPR
比较 CMP OPR1,OPR2 OPR1-OPR2
标志:INC和DEC: O D I T S Z A P C
× - - - ×××× -
NEG和CMP: × - - - ×××××
NEG指令 NEG指令NEG指令把操作数当成一个带符号数,如果原操作数是正数,NEG指令则将其变成负数(用补码表示);如果原操作数是负数(用补码表示),NEG指令则将其变成正数。
方法:“各位(包括符号位)求反,末位加1”.
ExampleExample* 若AL=00010001B=+17,执行NEG