8086指令系统概述标准代码
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.寄存器送(段)寄存器或主存 MOV reg/mem/seg , reg; mov ax , bx ; ax←bx,字传送 mov ah , al ; ah←al,字节传送
file:///D|/乜嘢洪/8086指令系统概述标准代码.txt(第 2/9 页)2008-2-13 20:45:44
file:///D|/乜嘢洪/8086指令系统概述标准代码.txt
SS:[SP]←r16/m16/seg; 堆栈的特点
? 堆栈操作的单位是字,进栈和出栈只对字量 ? 字量数据从栈顶压入和弹出时,都是低地址字节送低字节,高地址字节送高字节 ? 堆栈操作遵循先进后出原则,但可用存储器寻址方式随机存取堆栈中的数据 ? 堆栈常用来 : –临时存放数据 –传递参数 –保存和恢复寄存器 例:堆栈用于现场保护恢复
? 不允许段寄存器之间的直接数据传送 MOV DS,ES;非法指令:不允许段寄存器间传送
2 . 堆栈操作指令
file:///D|/乜嘢洪/8086指令系统概述标准代码.txt(第 4/9 页)2008-2-13 20:45:44
file:///D|/乜嘢洪/8086指令系统概述标准代码.txt
? 堆栈是一个“后进先出FILO”(或说“先进后出FILO”) 的主存区域,位于堆栈段中;SS段寄存器记录其段地址 ? 堆栈只有一个出口,即当前栈顶;用堆栈指针寄存器SP指定 ? 栈顶是地址较小的一端(低端),栈底不变 堆栈的操作:堆栈只有两种基本操作:进栈和出栈, 对应两条指令PUSH和POP PUSH :进栈指令先使堆栈指针SP减2, 然后把一个字操作数存入堆栈顶部 POP :出栈指令把栈顶的一个字传送至指定的目的操作数, 然后堆栈指针SP加2 PUSH r16/m16/seg SP←SP-2; POP r16/m16/seg r16/m16/seg←SS:[SP] SP←SP+2
file:///D|/乜嘢洪/8086指令系统概述标准代码.txt(第 1/9 页)2008-2-13 20:45:44
file:///D|/乜嘢洪/8086指令系统概述标准代码.txt
?双操作数指令,除串操作指令外,不允许两个都是存储器。 ?立即数,CS不能做目的操作数。 ?IP不能显示地用做操作数。 1.数据传送类指令 ?数据传送是计算机中最基本、最重要的一种操作 ?传送指令也是最常使用的一类指令 ?传送指令把数据从一个位置传送到另一个位置 ?除标志寄存器传送指令(SAHF,POPF)外,均不影响标志位 ?重点掌握 MOV PUSH POP XCHG IN OUT XLAT LEA 传送指令MOV(move) 1.立即数送寄存器或主存 mov al , 4 ; mov cx , 0ffh ; mov si , 200h ; mov byte ptr [si] , 0ah ; mov word ptr [si+2 ], 0bh ; # 注意立即数是字节量还是字量 # 明确指令是字节操作还是字操作 MOV reg/mem , im al←4,字节传送 cx←00ffh,字传送 si←0200h,字传送 byte ptr 说明是字节操作 word ptr 说明是字操作
mov ds , ax ; mov [bx] , al ; 3.主存送(段)寄存器 mov al , [bx] mov dx , [bp] ; mov es , [si] ;
ds←ax,字传送 [bx]←al,字节传送 MOV reg/seg , mem; dx←ss:[bp] es←ds:[si]
3. 交换指令XCHG(exchange) ?把两个地方的数据进行互换 ?寄存器与寄存器之间对换数据 ?寄存器与存储器之间对换数据 ?不能在存储器与存储器之间对换数据 4. 换码指令XLAT(translate) ?将BX指定的缓冲区中、AL指定的位移处的一个字节数据取出赋给AL XLAT;al←ds:[bx+al] ?换码指令执行前: 在主存建立一个字节量表格,内含要转换成的目的代码 表格首地址存放于BX,AL存放相对表格首地址的位移量 ?换码指令执行后: 将AL寄存器的内容转换为目标代码 换码指令没有显式的操作数,但使用了BX和AL;因为换码指令使用了隐含寻址方式——采用默认操作数 5. 输入输出指令
file:///D|/乜嘢洪/8086指令系统概述标准代码.txt
1/2字节 操作码
0/1字节 mod reg r/m
0/1/2字节 位移量
0/1/2字节 立即数
mov ax,[BP+0] ;
机器代码是 8B 46 00
?前一个字节8B是操作码(含w=1表示字操作) ?中间一个字节46(01 000 110)是 “mod reg r/m”字节 –reg=000表示目的操作数为AX –mod=01和r/m=110表示源操作数为[BP+D8] ?最后一个字节就是8位位移量〔D8=〕00 8086指令系统概述 ?Intel 8086指令系统共有二万多条指令,用了一百多个助记符 ,可分成6类功能组: ① 数据传送类指令 ② 算术运算类指令 ③ 逻辑运算(位操作)类指令 ④ 串操作类指令 ⑤ 控制转移类指令 ⑥ 处理机控制类指令 学习指令的注意事项 ?指令的功能——该指令能够实现何种操作。通常指令助记符就是指令功能的英文单词或其缩写形式 ?指令支持的寻址方式——该指令中的操作数可以采用何种寻址方式 ?指令对标志的影响——该指令执行后是否对各个标志位有影响,以及如何影响 ?其他方面——该指令其他需要特别注意的地方,如指令执行时的约定设置、必须预置的参数、隐含使用的寄存器等 指令格式的通用规定
# 不存在存储器向存储器的传送指令 4.段寄存器送寄存器或主存 mov si , ds mov ax , es ; mov ds , ax ; ax←es ds←ax←es MOV reg/mem , seg;
# 对段寄存器的操作有一些限制 MOV指令传送功能: 立即数 段寄存器 CS DS ES SS 通用寄存器 AX BX CX DX BP SP SI DI 存储器
file:///D|/乜嘢洪/8086指令系统概述标准代码.txt(第 3/9 页)2008-2-13 20:45:44
file:///D|/乜嘢洪/8086指令系统概述标准代码.txt
非法传送种种 1.两个操作数的类型不一致 –-----例如源操作数是字节,而目的操作数是字;或相反 ? 绝大多数双操作数指令,除非特别说明,目的操作数与源操作数必须类型一致,否则为非法指令 ? 寄存器有明确的字节或字类型,有寄存器参与的指令其操作数类型就是寄存器的类型 ? 对于存储器单元与立即数同时作为操作数的情况,必须显式指明; byte ptr 指示字节类型 , word ptr 指示字类型。 2.两个操作数不能都是存储器 –------传送指令很灵活,但主存之间的直接传送却不允许 ? 8086指令系统不允许两个操作数都是存储单元(除串操作指令),要实现这种传送,可通过寄存器间接实现 mov ax , buffer1;ax←buffer1(将buffer1内容送ax) mov buffer2 , ax;buffer2←ax;这里buffer1和buffer2是两个字变量、;实际表示直接寻址方式 3.段寄存器的操作有一些限制 –----段寄存器属专用寄存器,对他们的操作能力有限 ? 不允许立即数传送给段寄存器 MOV DS,100H;非法指令:立即数不能传送段寄存器 ? 不允许直接改变CS值 MOV CS,[SI] ;不允许使用的指令 MOV AL , 050AH;非法指令:050Ah为字,而AL为字节
;字节输出:I/O端口←AL(i8直接寻址) ;字节输出:I/O端口←AL(DX间接寻址) ;字输出:I/O端口←AX(i8直接寻址) ;字输出:I/O端口←AX(DX间接寻址)
file:///D|/乜嘢洪/8086指令系统概述标准代码.txt
?注意不是获取存储器单元的内容 7. 标志传送指令
例:教材P77~P78
输出指令OUT : 将CPU内的AL/AX数据传送给外设 OUT i8,AL OUT DX,AL OUT i8,AX OUT DX,AX 6.地址传送指令 ?地址传送指令将存储器单元的逻辑地址送至指定的寄存器 –有效地址传送指令 LEA –指针传送指令 LDS和LES
file:///D|/乜嘢洪/8086指令系统概述标准代码.txt(第 7/9 页)2008-2-13 20:45:44
file:///D|/乜嘢洪/8086指令系统概述标准代码.txt(第 5/9 页)2008-2-13 20:45:44
Baidu Nhomakorabea
file:///D|/乜嘢洪/8086指令系统概述标准代码.txt
push ax push bx push ds ... pop ds pop bx pop ax
;进入子程序后
;返回主程序前
file:///D|/乜嘢洪/8086指令系统概述标准代码.txt
popf ;将堆栈内容取到标志寄存器
;FLAGS←AX
(实际编程时,不要这么做,Windows OS 不允许,DOS下还需要另外编写INT 1的中断服务程序。单步调试可在Debug下做)
file:///D|/乜嘢洪/8086指令系统概述标准代码.txt(第 9/9 页)2008-2-13 20:45:44
file:///D|/乜嘢洪/8086指令系统概述标准代码.txt(第 6/9 页)2008-2-13 20:45:44
XCHG reg , reg / mem;
例:教材P77
file:///D|/乜嘢洪/8086指令系统概述标准代码.txt
?8086通过输入输出指令与外设进行数据交换;呈现给程序员的外设是端口(Port)即I/O地址 ?8086用于寻址外设端口的地址线为16条,端口最多为216=65536(64K)个,端口号为0000H~FFFFH ?每个端口用于传送一个字节的外设数据 输入输出寻址方式:’ ?8086的端口有64K个,无需分段,设计有两种寻址方式 v直接寻址:只用于寻址00H~FFH前256个端口,操作数i8表示端口号 v间接寻址:可用于寻址全部64K个端口,DX寄存器的值就是端口号 ?对大于FFH的端口只能采用间接寻址方式 输入指令IN : 将外设数据传送给CPU内的AL/AX IN AL,i8 IN AL,DX IN AX,i8 IN AX,DX ;字节输入:AL←I/O端口(i8直接寻址) ;字节输入:AL←I/O端口(DX间接寻址) ;字输入:AX←I/O端口(i8直接寻址) ;字输入:AX←I/O端口(DX间接寻址)
?标志寄存器传送指令用来传送标志寄存器FLAGS的内容,方便进行对各个标志位的直接操作.有2对4条指令: –F的低8位与AH传送:LAHF和SAHF –16位传送:PUSHF和POPF 1.标志低字节进出AH指令 LAHF ;AH←FLAGS的低字节 ?LAHF指令将标志寄存器的低字节送寄存器AH ?SF/ZF/AF/PF/CF状态标志位分别送入AH的第7/6/4/2/0位,而AH的第5/3/1位任意 SAHF ;FLAGS的低字节←AH ?SAHF将AH寄存器内容送FLAGS的低字节 ?用AH的第7/6/4/2/0位相应设置SF/ZF/AF/ PF/CF标志 2.标志寄存器进出堆栈指令 PUSHF ;SP←SP-2 ;SS:[SP]←FLAGS ?PUSHF指令将标志寄存器的内容压入堆栈,同时栈顶指针SP减2 POPF ;FLAGS←SS:[SP] ;SP←SP+2 ?POPF指令将栈顶字单元内容送标志寄存器,同时栈顶指针SP加2
例2.12:置位单步标志TF pushf pop ax or ax,0100h ;保存全部标志到堆栈 ;从堆栈中取出全部标志 ;设置D8=TF=1, ;ax其他位不变 push ax ;将ax压入堆栈
file:///D|/乜嘢洪/8086指令系统概述标准代码.txt(第 8/9 页)2008-2-13 20:45:44