8086堆栈指令
8086 汇编语言 利用堆栈 2个字求和的方法
8086 汇编语言利用堆栈 2个字求和的方法8086汇编语言是一种低级程序设计语言,常用于早期计算机系统的开发和编程。
堆栈是汇编语言中重要的数据结构之一,用于临时存储和管理数据。
在本文中,我将介绍一种利用堆栈来实现2个字求和的方法。
1. 概述在8086汇编语言中,一个字由两个字节组成,每个字节占8位。
为了将两个字相加,我们需要先将它们分别存储在内存中,并使用堆栈来实现求和操作。
2. 方法步骤1:将两个字存储在内存中我们需要将待求和的两个字存储在内存中。
假设我们将第一个字存储在`[位置区域1]`,第二个字存储在`[位置区域2]`。
这样,我们就可以通过指令`MOV AX, [位置区域1]`将第一个字加载到AX寄存器中,再通过指令`MOV BX, [位置区域2]`将第二个字加载到BX寄存器中。
步骤2:将两个字分解成高字节和低字节由于8086是一个16位系统,我们需要将两个字分解成高字节和低字节,以便进行逐位相加。
我们可以使用指令`MOV AH, AL`将AX寄存器的高字节(高8位)移到AH寄存器中,使用指令`AND AX,00FFH`将AX寄存器的低字节(低8位)保留在AL寄存器中。
步骤3:逐位相加现在,我们可以逐位相加两个字的低字节和高字节。
为了实现这一点,我们可以使用指令`ADD AL, BL`将AL寄存器中的低字节与BL寄存器中的低字节相加,再使用指令`ADC AH, BH`将进位位加到AH寄存器的高字节上。
步骤4:获取结果我们可以通过指令`MOV [结果位置区域], AX`将求和后的结果存储到内存中的指定位置区域。
假设我们将结果存储在`[位置区域3]`,则可以使用指令`MOV [位置区域3], AX`将AX寄存器的值存储到`[位置区域3]`。
3. 示例代码下面是一个利用堆栈来实现2个字求和的示例代码:```MOV AX, [位置区域1]MOV BX, [位置区域2]MOV AH, ALAND AX, 00FFHADD AL, BLADC AH, BHMOV [位置区域3], AX```4. 总结与观点通过利用堆栈,在8086汇编语言中可以实现对两个字的求和操作。
8086汇编指令大全.
不允许寄存器或存储单元到除CS外的段寄存器
2入栈(出栈指令PUSH (POP
注意:
PUSH操作数不能是“立即数” POP操作数不能是段寄存器
CS
不影响标志位
先进后出
单操作符
3交换指令XCHG
注意:
只允许寄存器与存储单元之间的交换
不影响标志位
4换码指令XLAT
5地址传送指令LEA :偏移地址
ZF=0
SF符号标志位
OF溢出标志位
DF方向标志位
IF中断允许位IF=1时响应外部中断
TF跟踪标志位
操作数:[目的操作数(OPD ,源操作数(OPS ] ;立即操作数,寄存器操作数,存储器操作数。寻址方式:
1寄存器寻址例:INC AX ; MOV AX , BX
2寄存器间接寻址(寄存器只能是BX , DI , SI , BP ; [PA=(BX、DI、SI +DS》4或BP+SS》4]
6数据段指针送寄存器LDS :低地址的字送指定的通用寄存器(SI、高地址的字
送DS
7附加段指针送寄存器指令LES :与LDS相似,低地址的字送通用寄存器(DI、高
地址送ES
上三指令不影响标志位
8标志寄存器传送指令
LAHF :标志寄存器低八位送
AH
SAHF :AH送标志寄存器低八位
PUSHF :标志寄存器压入堆栈
标志寄存器:9个有效位,分6个状态寄存器和3个控制寄存器
CF当执行一个加法(减法使最高位产生进位(借位时CF=1否则
CF=0
PF指令执行的结果低8位有偶数个一时, CF=1否则
CF=0
AF当执行一个加法(减法使运算结果低4位向高4位有进位(借位时AF=1否则
8086CPU中的数据传送类指令
8086CPU 中的数据传送类指令数据传送类指令注意点1. 除 SAHF 、POPF 指令外,其余传送类指令CPU 执⾏后,对6个状态标志均⽆影响。
也就是说,除 SAHF 、POPF 指令外,CPU 只是做了数据传送,并没有进⾏数据运算,对状态标志位⽆影响。
2. 语法规则1)⽴即数只能做源操作数2)类型⼀致3)类型明确4)当ES 、DS 、SS 做⽬的操作数时,源操作数不能是⽴即数。
5)CS 、IP 不能做⽬的操作数6)两存储器单元之间不能直接操作数据传送类指令通⽤数据传送指令-MOVmov 指令的格式为取有效地址指令-LEALEA 指令的格式为REG_16表⽰⼀个16位寄存器,理论上只要是16位即可,但是因为存放有效地址,所以最好是 BX 、BP 、SI 、DIMEM 是5种存储器寻址⽅式之⼀指明的⼀个存储器单元。
例如等同于功能⼀样。
取地址指针指令-LDS 、LES这两个指令是将双字变量MEM 内容中的⾼16位送⼊DS/ES ,低16位送⼊指定的REG16中。
这⾥REG16不允许为段寄存器。
不常⽤,了解。
以LDS 为例,格式为REG_16表⽰⼀个16位寄存器MEM 是5种存储器寻址⽅式之⼀指明的⼀个存储器单元例如得到地址指针,就可以很容易取数据MOV DST ,SRCLEA REG_16,MEMLEA BX ,data1 ;data1是变量,直接寻址找到这个存储单元把有效地址送给BXMOV BX ,OFFSET data1LDS REG_16,MEMTABLE DB 10H ,20H...LDS BX ,TABLE ;TABLE 的段地址->(DS ),TABLE 的偏移地址->(BX)Processing math: 100%MOV DX,[BX]实际中LEA⽤的⽐较多。
标志传送指令-LAHF、SAHF指令LAHF(load AH register from flags)可以将PSW寄存器中的低8位传送到AH中,指令SAHF(store AH register from flags)可以将AH 的内容传送到PSW寄存器中的低8位。
8086汇编指令
HLT 处理器暂停, 直到出现中断或复位信号才继续. O MN|ea.O
WAIT 当芯片引线TEST为高电平时使CPU进入等待状态. &ET PYf %#
ESC 转换到外处理器. Kl+4 A} Uo
LOCK 封锁总线. %'[ pucEF
NOP 空操作. bn"z&g
POPD 32位标志出栈. @A6 iY
二、算术运算指令 J 299 mgB
ADD 加法. (RI)<zaK ;
ADC 带进位加法. ~+ {*KPiD
INC 加 1. oO;L l? ~
AAA 加法的ASCII码调整. At@0G\^
DAA 加法的十进制调整. '| g sm O
STC 置进位标志位. y O?52YO
CLC 清进位标志位. *Ja,3Q q
CMC 进位标志取反. J~rjI 24
STD 置方向标志位. .2 ST Bh.;
CLD 清方向标志位. G X>T~i\f8
STI 置中断允许位. t M{U6 k
CLI 清中断允许位. z`rW2UO#a`
JO 溢出转移. PW -s F
JP/JPE 奇偶性为偶数时转移. ,,V uv n
JS 符号位为 "1" 时转移. E J Ta ~
3>循环控制指令(短转移) aDX 4 }`u
LOOP CX不为零时循环. I, ?!N zB
LOOPE/LOOPZ CX不为零且标志Z=1时循环. ; 5!8LmZ0#
XADD 先交换再累加.( 结果在第一个操作数里 ) PK +sGV
8086常用指令表
8086/8088常用助记符指令类型助记符目的源功能注释数据传送MOV X X 把数据从源操作数传送到目的操作数1.两个操作数不能同时为内存操作数,也不能同时为立即数,目的操作数不能为立即数2两个操作数的类型须一致3立即数不能直接传入段寄存器4CS,IP不能作目的操作数5段寄存器之间不能直接传送PUSH X把指定的寄存器/内存单元的内容压入堆栈1.按字操作,CS能入栈内存不能直接寻址.P-2→SP,再写入栈顶POP X从栈顶弹出一字到指定的寄存器/内存单元1.同上2.先弹出一字,再SP-2→SP XCHG 寄寄/内两操作数互换内容不能用立即数和段寄存器XCHG 寄指定寄存器同累加器互换内容IN AC 端口号从指定端口送数到AL端口号为立即数,地址为8位端口号在DX中,地址为16位OUT 端口号 AL从AL送数到指定端口LEA 寄内存LDS 寄内存LES 寄内存把内存偏址送指定寄存器把内存低2字节送寄存器,高2字节送DS(ES)只能用通用寄存器,不能用段寄存器LAHF把标寄低8位送AHSAHF把AH送标寄低8位PUSHF标寄入栈POPF栈顶弹出进标寄算术运算ADD X X加法(和送目的操作数)加减1.2.同MOV3.段寄存器不能作操作数4.调正在AL中进行,并必需紧跟在运算之后执行.5.比较运算同减法,结果不存,而仅影响标志寄存器6.乘除法的目的操作数隐含是ACAL*乘数→AX, AX*乘数→DX AX,AX/除数→AL, 余数在AH中DXAX/除数→AX, 余数在DX中7.加1减1指令把操作数当无符号数,其他加减指令是否为有符号数要由程序设计需要设定ADC X X带进位加法INC X 指定的寄/内的内容加1AAA分离BCD码调正(AL)DAA组合BCD码调正(AL)SUB X X减法SBB X X带借位减法DEC X指定的寄/内的内容减1NEG X指定的寄/内的内容求补CMP X X 比较AAS分离BCD码调正(AL)DAS组合BCD码调正(AL)MUL 寄/内不带符号乘法IMUL 寄/内带符号整数乘法AAM 分离BCD码调正(AL)DIV 寄/内不带符号除法IDIV 寄/内带符号整数除法AAD非组合BCD码调正CBW扩展AL中的符号位到AHCWD扩展AX中的符号位到DX类型助记符目的源功能注释逻辑运算NOT X 对字或字节按位取反 1.2.3同上4.按位操作5.AND1不变(保持),AND0置0OR1置1,OR0不变(保持)自身与或,结果不变(保持),影响标志位, 自身XOR常用于清零XOR 1取反,XOR 0不变AND X X对字或字节按位与操作OR X X 对字或字节按位或操作XOR X X对字或字节按位异或操作TEST X X同AND,但结果仅影响标寄而不存目的操作数移位和循环移位SHL 寄/内 1/CL按位左移 CF←M←0 1.循环或移位的次数为1或CL中的数2.SHL一次,原数乘2SHR一次,原数除23.目的操作数不能是立既数SAL 寄/内 1/CL按位左移 CF←M←0SHR 寄/内 1/CL逻辑右移 0→M→CFSAR 寄/内 1/CL算术右移→M→CFROL 寄/内 1/CL循环左移 CF← ←M ←ROR 寄/内 1/CL循环右移 CF← →M →RCL 寄/内 1/CL带进位循环左移←CF←M←RCR 寄/内 1/CL带进位循环右移→CF→M→重复前缀REP重复后面字串指令,直到CX=0一般与字串指令联合使用REPE/REPZ当相等/为零时重复REPNE/REPNZ当不相等/不为零时重复MOVSB/MOVSW字符串传送 1.源串偏址在SI中,目的串偏址在DI中.2.每次自动修改SI,DI 内容3.装入和存储是对AX(AL)操作CMPSB/CMPSW字符串比较SCASB/SCASW字符串扫描LODSB/LODSW字符串装入STOSB/STOSW字符串存储转移JMP X无条件转移到指定内存地址操作数前可带NEAR或FAR前缀条件转移(无符号数)JA/JNBE X高于/不低于,不等于由比较和减法指令的结果JA/JNBE 表示二者等价JAE/JNB X大于等于/不低于JB/JNAE X低于/不高于,不等于TBE/JNA X低于等于/不高于条件转移(带符号数)JG/JNLE X大于/不小于等于JGE/JNL X大于等于/不小于JL/JNGE X小于/不大于不等于JLE/JNG X小于等于/不大于条件转移JE/JZ X等于/为零JNE/JNZ X不等于/不为零条件转移JC/JNC X有进位CF=1/无进位CF=0由影响标志位的操作结果JC/JNC表示二者是两个不同用法JO/JNO X有溢出OF=1/无溢出OF=0JP/JPE X奇偶性为偶PF=1JNP/JPO X奇偶性为奇PF=0JS/JNS X符号位为1/符号位为0FR15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0OF DF IF TF SF ZF AF PF CF 溢出方向符号零半进位奇偶进位类型助记符目的源功能注释LOOP X[CX]-1→[CX],[CX]≠0转移到X由CX决定循环次数循环LOOPZ/LOOPE X [CX]-1→[CX],[CX]≠0且ZF=1转移到X为零/相等时循环LOOPNZ/LOOPNE X[CX]-1→[CX],[CX]≠0且ZF=0转移到X非零/不相等时循环JCXZ X [CX]=0转移到X调用返回CALL 过程名调用指定地址开始的子程序对标寄无影响注意用堆栈保护断点RET子程返回RET XRETF标志操作CLC CF=0 (进位)STC CF=1CMC CF取反CLD DF=0 (方向)STD DF=1CLI IF=0 (中断)STI IF=1HLT暂停ESC交权INT 21H DOS功能调用AH=1键盘输入到AL,AH=2显示DL内容,AH=9显示DX为偏移量以$结尾的内存字串NOP空操作3个时钟伪指令功能特征符号 EQU 符号/表达式把右边的值赋予左边的符号1.不产生目标代码,不分配内存单元2.在同一源程序中同一符号不能用EQU重定义,可用=重定义符号=符号/表达式变量名 DB 表达式1,表达式2…. DWDD 定义字节(或字、双字)1.要求汇编分配内存单元,并把表达式1,表达式2…等存入2.为变量名分配这些内存单元的首字节地址段名SEGMENT [定位] [组合]['类别名'] :段名 ENDS 定义逻辑段定位隐含PARA,表示能被16整除ASSUME 段寄名:段名,段寄名:段名,….告诉汇编已定义的段与段寄的关系不产生目标代码,不分配内存单元,不为段寄存器存放段基值过程名 PROC [NEAR/FAR]:RET过程名 ENDP构造子程序最后语句RET不能少ORG 表达式定义下一个数据或指令的偏移量$表示偏移量的现行值宏名 MACRO 形参1,形参2,….ENDM宏定义宏名实参1,实参2,….宏调用一.指令由名字,操作码、操作数(地址)组成。
8086常用指令
JMP DWORD PTR OPR:执行的操作为(IP)<-(EA);(CS)<-(EA+2)
JMP指令不影响条件码。
四、标志寄存器传送指令
LAHF:Load AH with Flags
SAHF:Store AH into Flags
PUSHF/PUSHFD:标志位进栈
POPF/POPFD:标志位出栈
五、类型转换指令
CBW:字节转为字
CWD:字转为双字
CDQ:双字转4字
BSWAP:字节交换
REP指令:格式为:REP <串处理指令>,如REP INS等。执行规则是和循环类似,当CX=0时退出重复。由于这些串处理指令都只一次处理一个单位的数据,因此一般都需要与REP指令结合起来实现批量的数据传送。
结合REP指令的串处理指令用法实例: 若mess1,mess2是data段中指定的两个字符串,其中mess1在data中,为源串;mess2在extra中,为目的串
十四、条件转移指令
对单个条件标志比较,并由结果转移
JZ(JE):当结果为0或相等则跳转。相反:JNZ(JNE);
JS:当结果为负则跳转。相反:JNS;
JO:当溢出则跳转。相反:JNO;
JP(JPE):当奇偶位为1则跳转。相反:JNP(JPO);
JB(JNAE):当低于或CF=1则转移。相反:JNB(JAE),不低于则转移;
lea di,mess2;赋予目的变址DI
mov cx,17;指定重复次数
CLD;方向标志置零(从左向右扫描)
8086(8088)指令手册
ADC d,s
;d←d+s+CF
带进位加法。
指令的操作过程与ADD指令基本相同,惟一的不同是进位标志位CF的原状态也将一起参与加法运算,待运算结束,CF将重新根据结果置成新的状态。
IN AL,DX;AL←(端口(DX))
IN AX,DX;AX←(端口(DX))
注意:I/O指令只能用累加器作为执行I/O数据传送的机构,而不能用其他寄存器代替。另,当用直接I/O指令时,寻址范围仅为0~255,这适用于较小规模的微机系统;当需要寻址大于255的端口地址时,则必须用间接寻址的I/O指令。例如,在IBM PC/XT微机系统中,既用了0~255范围的端口地址,也用了255~65535范围的端口地址。
IMUL s
有符号乘法指令,它完成两个带符号的8/16位二进制相乘的功能。
对于两个带符号的数相乘,如果简单采用与无符号数乘法相同的操作过程,那么会产生完全错误的结果。为此,专门设置了IMUL指令。
IMUL指令除计算对象是带符号二进制数以外,其他都与MUL是一样的,但结果不同。
IMUL指令对OF和CF的影响是:若乘积的高一半是低一半的符号扩展,则OF=CF=0;否则均为1。它仍然可用来判断相乘的结果中高一半是否含有有效数值。另外,IMUL指令对其他标志位没有定义。
表三、数据寄存器的隐含使用………………………………………………第19页
表四、标志寄存器……………………………………………………………第20页
8086/8088指令分类
8086/8088的指令按功能可分为6类:数据传送、算术运算、逻辑运算、串操作、程序控制和CPU控制。
第4章Intel 80868088指令系统
物理地址=30000H+1150H=31150H
执行后: (AX)=5678H。
第四章 Intel 8086/8088指令系统
5. 相对基址变址寻址
特点:操作数的有效地址是一个基址寄存器与一个变址寄 存器的内容之和再加上8位或16位位移量。同样,当基址寄存器 为BX时,用DS作为段寄存器; 而当基址寄存器为BP时,则用 SS作为段寄存器。因此物理地址为 (SI) 8位 位移量 物理地址=(DS)×16+ (BX)+ + (DI) 16位 (SI) 8位 位移量 + 物理地址=(SS)×16+ (BP)+ (DI) 16位
执行后: (AX)=1234H, (BX)不变。
第四章 Intel 8086/8088指令系统
4.1.4 存储器寻址
操作数在存储器中。存储器是分段管理的, 要找到操作数, 必须指明操作数所在的段(段基址由段寄存器指明)及段内偏 移地址(以有效地址EA的形成方式指出)。 1. 直接寻址方式 特点:指令中直接给出操作数在段内的偏移量,段基址隐 含给出或用段前缀指明。该寻址方式适用于处理单个变量。
4.1.1 8086/8088的通用指令格式 机器语言指令是由二进制代码组成的。一条指令是由操作 码与操作数字段构成的,其一般格式为 操作码字段 + 操作数字段 操作码字段指明计算机所要执行的操作(即功能);操作 数字段指出在指令执行过程中所需要的操作数。 例如: ADD AX, BX
第四章 Intel 8086/8088指令系统
变址寄存器内容之和。 (SI) 物理地址=(DS)×16+ (BX)+ (DI) (SI) 物理地址=(SS)×16+ (BP)+ (DI) 适用表格或数组处理,表格或数组首地址可存放在基址寄存器中。
8086CPU指令和伪指令(中英文全解)
8086CPU指令和寄存器英文全称。
一、数据传送指令比如,mov(move)、push、pop、pushf(push flags)、popf(pop flags)、xchg(exchange)等都是数据传送指令,这些指令实现寄存器和内存、寄存器和寄存器之间的单个数据传送。
二、算术运算指令比如,add、sub(substract)、adc(add with carry)、sbb(substract with borrow)、inc (increase)、dec(decrease)、cmp(compare)、imul(integer multiplication)、idiv (integer divide)、aaa(ASCII add with adjust)等都是算术运算指令,这些指令实现寄存器和内存中的数据运算。
它们的执行结果影响标志寄存器的sf、zf、of、cf、pf、af位。
三、逻辑指令比如,and、or、not、xor(exclusive or)、test、shl(shift logic left)、shr(shift logic right)、sal(shift arithmetic left)、sar(shift arithmetic right)、rol(rotate left)、ror(rotate right)、rcl(rotate left through carry)、rcr(rotate right through carry)等都是逻辑指令。
除了not 指令外,它们的执行结果都影响标志寄存器的相关标志位。
四、转移指令可以修改IP,或同时修改CS和IP的指令统称为转移指令。
转移指令分为一下几类。
(1)无条件转移指令,比如,jmp(jump);(2)条件转移指令,比如,jcxz(jump if CX is zero)、je(jump if equal)、jb(jump if below)、ja(jump if above)、jnb(jump if not below)、jna(jump if not above)等;(3)循环指令,比如,loop;(4)过程,比如,call、ret(return)、retf(return far);(5)中断,比如,int(interrupt)、iret(interrupt return)。
8086指令
第3章
3.3.3 标志寄存器传送指令
8088/8086MPU的指令系统
标志寄存器传送(有四条标志传送指令) HF (Load AH from FLAG)读取标志指令
将标志寄存器中的 SF、ZF、AF、PF和CF(即低8位)传送至AH寄存器的指
定位,空位没有定义。 2.SAHF (Store AH to FLAG)设置标志指令
对堆栈有两种操作:入栈,出栈
①入栈,也叫压栈,是把一个16位数据推入栈中 压栈的操作顺序: SP 的内容先减 2 ,指示一个新的字单元 ,然后再把该压的字压入这个单元中。 例如:设AX内容为1234H,栈的数据为(SS)=2000H, (SP)=0108H,将AX内容压入堆栈。 由图可见,压栈前(SP)=0108H,压栈后(SP)=0106 H,SP永远指示栈顶。
功能:带进位的加法,将源操作数、目的操作数以及标志寄存器中的进位标 志位CF相加,并将和放入目的操作数中。 DSTSRC+DST+CF 格式3:INC OPR
功能:将目的操作数加1,放入目的操作数中. OPROPR+1
第3章
8088/8086MPU的指令系统
注意事项:
ADD和ADC指令是双操作数指令,它们的两个操作数不能
位。
• 2 、编写执行双精度数( DX,CX) 和( BX,AX) 相加的指令 序列。 • 3、写出25H*65H的运算指令序列。 • 4、用指令实现将AL的高4位清0.
CF
OF=1 1
乘积高一半不为0
对于IMUL,CF OF=0 0
乘积的高一半为低一半的符号 扩展.
CF OF=1 1 其他情况.
第3章
8086指令系统总结
8086指令系统总结学习微处理器及其程序设计,必须掌握微处理器的指令系统。
本章以 8086 微处理器为例介绍微型计算机的指令系统,包括指令格式、寻址方式和各类指令功能。
要明确各种寻址方式的区别和特点,掌握有效地址和物理地址的计算方法,要正确使用指令,掌握各类指令的功能、对标志位的影响和使用上的一些特殊限制。
能够编写小汇编程序,初步掌握汇编程序的编写和调试方法。
本章的重点难点内容是: 8086 的指令格式及寻址方式, 8086 的常用指令和8086 指令前缀的使用。
下面我们分别进行总结:一.8086寻址方式(1)操作数是数字,指令中立即写出数字------------立即数寻址MOV AX,1234H 解释此句意义(2)操作数是寄存器内容,指令中写出寄存器的符号---------寄存器寻址MOV AX,BX(3)操作数是存储单元内容,用括号括出存储单元有效地址-----直接寻址MOV AX,[1234H]MOV AX,ES:[1234H](4)操作数是存储单元内容,用括号括出寄存器或其表达式,寄存器或其表达式的值为存储单元有效地址-------------间接寻址MOV AH,[BX]MOV AX,ES:[SI]MOV AL,[BX+SI+5]===5[BX+SI]===5[BX][SI]二.8086指令系统1.数据传送指令(一)通用传送指令(1)MOV指令指令格式:MOV 目,源功能:将源操作数传送给目标操作数。
(2)堆栈操作指令进栈指令:PUSH格式:PUSH 源功能:将源操作数压入堆栈。
例:用堆栈指令完成上例的功能。
MOV AX,3000HMOV DS,AX ;段寄存器填充MOV SI,0100H ;基本指令执MOV DI,2000H ;行前的初值MOV CX,50NT:PUSH [SI] ;程序从这POP [DI] ;开始设计INC SIINC SIINC DIINC DILOOP NTMOV AH,4CHINT 21H(3)交换指令 XCHG格式:XCHG 目,源功能:源和目标中的内容交换。
第3章 8086指令系统(最后有练习题)
开 始
8086CPU的指令系统的基本指令
包括数据传送类指令、算术运算类指令、 位操作类指令、串操作类指令、控制转移 类指令、处理机控制类指令。后几节将分 别介绍这些指令的语句格式和功能。
3.1 8086的寻址方式
3.1.1 数据的寻址方式 3.1.2 程序转移地址的寻址方式 3.1.3 对端口的寻址方式
3.1.2 程序转移地址的寻址方式
用来确定转移指令及CALL指令的转向地址。
段内寻址
段内直接寻址 段内间接寻址 段间直接寻址 段间间接寻址
段间寻址
段内:转移指令与转向的目标指令在同一代码段 中,(CS)不变。
段间:转移指令与转向的目标指令在两个代码段中, (CS) 变化。
表示转移距离(称为位移量)的操作符:
返回本节
2 . 寄存器寻址
寄存器寻址方式的操作数在指令指明的寄 存器中。 汇编格式:R ,其中R表示寄存器名。 功能:操作数直接存放在寄存器R中。 例如:MOV AL,BL
【例3-2】下列程序执行后,(AX)=?,
(BX)=?
MOV AX,1234H
MOV BX,5678H
ADD AX,BX 执行:1234H→AX 5678H→BX (AX)+(BX)→AX 执行后:(AX)=68ACH,(BX)=5678H
3 . 直接寻址
特点:操作数在内存中。 汇编格式:①含有变量的地址表达式。 ②段寄存器名:[EA] 。 功能:指令下一字单元的内容是操作数的偏 移地址EA。 图形表示:
【例3-3】
寄存器和存储器内容为:(AX)=1212H, (DS)=3000H,(32000H)=45H, (32001H)=46H。 执行指令:MOV AX ,[2000H] 问执行后:(AX)=? Step1:计算地址DS*16+2000H=32000H Step2:找内容(32000H),(32001H) 所以执行后:(AX)=4645H
第3章8086指令系统(上)
或
(SS)×16+(BP)
【例3-4】 已知:(DS)=3000H,(BX)=1100H,(31100H)= 12H,(31101H)=34H,执行指令:MOV AX, [BX]。 操作数的物理地址为:(DS)×16+(BX)=3000H×16+ 1100H=31100H,指令执行后(AX)=3412H。
本章内容提要
3.1 8086指令系统入门 3.2 数据据传送类指令 3.3 算术运算与逻辑运算类指令
3.1 8086指令系统入门
3.1.1 指令分类
数据传送类指令 算术运算类指令
字符串操作指令 处理器控制类指令
逻辑运算类指令
程序控制类指令
3.1.2 指令格式
操作码 [目的操作数][,源操作数]
3.1.3 操作数寻址
ADD SI, 2 LOOP LOP MOV BX, SI MOV DI, BX MOV 1000[DI], AX
;将累加和存入1000+(DI)指 ;向的内存单元
3.2 数据传送类指令
3.2.1 传送指令
格式:MOV DST, SRC 功能:将源操作数传送给目的操作数。 ① ② ③ ④ 在CPU内部寄存器之间进行数据传送 MOV AX,BX 在CPU内部寄存器与存储器之间进行数据传送 MOV AX,[1000H] 将立即数传送给寄存器 MOV AX,1234H 将立即数传送给存储单元 MOV [1000H],1000H
【例3-15】 已知:(DS)=3000H,(32000H)=12H,(32001H)= 34H,(32002H)=56H,(32003H)=78H。 执行指令:LDS SI, [2000H]。
第三次课 8086的指令系统
第三章8086的指令系统3.1 8086指令系统概述所谓一个微处理器的指令系统是一个微处理器所执行的全部指令的集合。
在8086的指令系统中一共有133条指令。
8086指令系统是在8位微处理器8080/8085的指令系统基础上设计的,它兼容了8080/8085的全部指令,这部分对8位微处理器具有兼容性的指令往往是处理字节(8位)的。
此外,8086还有自己所特有的对字或字符串的处理指令,以及对带符号数的运算指令、中断指令和协处理器指令。
对微处理器的指令的描述,一般有两种表示方法:指令的机器码和汇编指令。
无论对于机器码指令还是对于汇编指令均要解决三个问题(三个信息)(1)指令要完成什么操作(操作码);(2)参加这个操作的操作数在哪里(操作数);(3)操作结果放在哪里(结果);为了简化指令,通常在微机系统中规定:操作结果要放在某一个操作数中。
如MOV AL,08H;ADD AX,BX;(源操作数,目标操作数)这样,就将指令所要提供的信息简化为了两部分:操作码、操作数。
指令的机器码就是用二进制码描述指令的操作码和操作数的一种方式,实际上在微机系统内部,指令就是以机器码的形式存在的。
所谓的汇编指令是用指令功能的英文缩写表示操作码,用数字和符号表示操作数的指令描述方法。
例如操作码操作数MOV AX,2000H操作码B8H操作数:00H20H由于汇编语言程序有便于理解、识别、阅读和交流的优点。
所以汇编指令得到了广泛的应用。
但由于最终在机器中使用的是机器码,所以要有一个中间环节就是对其进行翻译。
3.2 8086指令的寻址方式所谓寻址方式就是寻找操作数的方式,所以寻址方式实际上在两种情况下被涉及:一种是用来对操作数进行寻址;另一种是对转移地址和调用地址进行寻址。
下面我们所讨论的寻址方式都是针对操作数的,关于指令地址的寻址,将在讲述转移指令和调用指令时作具体说明。
一条指令的机器码通常包含操作码(OP)和操作数两部分。
8086微处理器的指令集架构
8086微处理器的指令集架构8086微处理器是一种16位的通用微处理器,由英特尔公司于1978年发布。
它的指令集架构称为x86,后来的许多处理器都是基于该架构进行扩展的。
这个指令集架构是8086微处理器与其后继处理器(如80286、80386等)之间的兼容性的基础,影响了后来的计算机硬件和软件设计。
8086指令集架构具有大量的指令和寻址模式,这些指令可以操作不同的数据类型和寄存器。
下面我们来介绍一些8086指令集的主要特点和功能:1.数据传送指令:- MOV:用于将数据从一个位置复制到另一个位置。
例如,MOV AX, BX可以将BX寄存器的内容复制到AX寄存器。
- PUSH和POP:用于将数据从寄存器或内存推送到堆栈或从堆栈中弹出。
例如,PUSH AX将AX寄存器的内容推送到堆栈中。
2.算术和逻辑指令:- ADD、SUB、INC和DEC:用于对寄存器或内存中的数据执行加法、减法、递增和递减操作。
- AND、OR、XOR和NOT:用于对寄存器或内存中的数据执行逻辑操作,如与、或、异或和取反。
- MUL和DIV:用于对寄存器或内存中的数据执行乘法和除法操作。
3.控制转移指令:- JMP:用于无条件跳转到指定标签或内存位置。
- JZ、JNZ、JE、JNE等:用于根据条件跳转到不同的指令位置。
例如,JZ表示如果零标志位为真,则跳转。
- CALL和RET:用于调用和返回子程序。
4.串操作指令:- MOVS、LODS、STOS、CMPS:用于在内存之间复制、加载、存储和比较数据。
- REP和REPE:用于重复执行串操作指令。
5.输入输出指令:- IN和OUT:用于从输入输出端口读取和写入数据。
- INT和IRET:用于进行中断和中断返回操作。
在8086指令集架构中,还有一些特殊的指令和寻址模式,用于实现更复杂的功能。
例如,8086支持段寻址模式,即使用段寄存器和偏移地址的组合来访问内存。
此外,还有一些面向特定任务的指令,如乘法指令和浮点操作指令等。
第3章80888086指令系统(老师用的课件哦)
第3章 8088/8086指令系统
图3.5 变址寻址示意图
第3章 8088/8086指令系统
例:MOV AX,200AH[SI];或(AX)←
[(DS)*16+(SI)+200AH
EA=(SI)
+200AH,SI为变址寄存器,200AH为16位的位移量。
图3.6为用BP寄存器进行变址寻址时的示意图。
第3章 8088/8086指令系统
3.存储器操作数 存储器操作数是把操作数放在存储器单元中。对这 类操作数,在指令中必须给出存储器的地址。存储器 的实际地址(也称物理地址)是由指定的段基址和段内地 址偏移量(也称为有效地址EA)所决定的。由于段基址 相对很少改变,故一般预先予以指定,以后通过隐含 方法使用,即只要段基址未改变,其在汇编指令中便 不再出现。此时,只给出有效地址EA(以各种寻址方式 给出)。
第3章 8088/8086指令系统
3.2 8088/8086指令系统
3.2.1 数据传送指令 1 .数据传送指令MOV 指令格式:MOV OPRD1,OPRD2 MOV 为操作码。 OPRD1为目的操作数,可以是寄存器、存储器、
累加器。
第3章 8088/8086指令系统
OPRD2为源操作数,可以是寄存器、存储器、累 加器和立即数。
第3章 8088/8086指令系统
4.寄存器间接寻址
寄存器间接寻址的操作数类型为存储器操作数,与 直接寻址方式的区别是:该存储单元的16位段内偏移 地址,不是从指令代码中直接得到,而是从指令所指 定的寄存器中得到。能用于间接寻址的寄存器为SI、 DI、BX、BP。若以SI、DI、BX进行间接寻址,应由 数据段DS的内容作为段基址,间接寻址寄存器的内容 为段内偏移量,并指定形成操作数的物理地址。若以 寄存器BP间接寻址,则BP中的内容为段内偏移量,段寄 存器SS与之一起形成物理地址。寄存器间接寻址示意 图如图3.4所示。
8086汇编语言学习(三)8086中的段和栈
8086汇编语⾔学习(三)8086中的段和栈1. 8086汇编中的段段地址 8086对内存寻址的⽅式是通过段地址*16+偏移地址的⽅式实现的,⽽在16位的8086CPU下,段地址和偏移地址也都是16位的。
这意味着,对于任意⼀个段,段的起始地址必定为16的倍数(段地址*16)。
对于同⼀个内存地址,存在多种不同的内存寻址⽅式: 例如:段地址1000H+偏移地址2345H,与段地址1234H+偏移地址0005H都可以对内存地址12345H进⾏寻址(段地址1204H+偏移地址0305H等等也可⾏,⾮常⾃由)。
段的最⼤空间为2^16bit=64KB(例如:将段地址设为1000H,将段的⼤⼩设置为64KB,则段的内存范围为10000H-1FFFFH)。
段的最⼩空间为2^4bit=16bit (例如:将段地址设为1234H,将段的⼤⼩设置为16bit,则段的内存范围为12340H-1234FH)。
段的逻辑意义 需要注意,内存段的概念并不是内存硬件所固有的,⽽是从CPU寻址的⾓度出发,将内存中的物理连续区域逻辑上分隔为不同的区域。
内存段这⼀概念的提出有利于在复杂程序、多程序系统中对同⼀程序的不同逻辑部分以及不同程序的内存进⾏更好的访问和管理。
段寄存器 内存段的存在能够划分同⼀程序中的不同逻辑部分,进⾏更有效的管理和更简单的访问。
汇编程序的内存通常可以被划分为三部分:代码、栈以及数据。
通常为了避免混淆,会将这三种不同的逻辑部分分别存放在三个不同的内存段中,便于理解(当然也能将同⼀部分的内存存放在不同的段中,这主要取决于程序的复杂程度)。
8086CPU提供了对代码、栈、数据三种内存段访问的段寄存器,分别是代码段寄存器CS、栈段寄存器SS、数据段寄存器DS以及附加段寄存器ES。
代码段寄存器CS 代码段寄存器CS在前⾯的博客中已经有过介绍,CPU在运⾏时会将CS:IP指向的内存中的数据当作指令来执⾏。
栈段寄存器SS 执⾏栈相关的指令时,CPU通过SS:SP获得当前栈顶指针。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
8086系统中的堆栈
2. 堆栈操作指令
堆栈是一个“后进先出FILO”(或说“先 进后出”)的主存区域,位于堆栈段中; SS段寄存器记录其段地址 堆栈只有一个出口,即当前栈顶;用堆栈 指针寄存器SP指定 堆栈只有两种基本操作:进栈和出栈,对 应两条指令PUSH和POP
图示
进栈指令PUSH
进栈指令先使堆栈指针SP减2,然后把一 个字操作数存入堆栈顶部
POP AX POP wvar
堆栈操作的特点
➢ 堆栈操作的单位是字,进栈和出栈只对字量 ➢ 字量数据从栈顶压入和弹出时,都是低地址字节
送低字节,高地址字节送高字节 ➢ 堆栈操作遵循先进后出原则,但可用存储器寻址
方式随机存取堆栈中的数据 ➢ 堆栈段是程序中不可或缺的一个内存区,常用来
临时存放数据 传递参数 保存和恢复寄存器
PUSH r16/mபைடு நூலகம்6/SeG
演示
;SP←SP-2 ;SS:[SP]←r16/m16/seg
PUSH AX PUSH [2000H]
出栈指令POP
出栈指令把栈顶的一个字传送至指定的目 的操作数,然后堆栈指针SP加2
POP r16/m16/seg
演示
; r16/m16/seg←SS:[SP]
;SP←SP+2