Pentium的指令系统(2)——Pentium的指令系统

传送指令

Pentium有七组传送指令,用来实现CPU的内部寄存器之间、CPU和寄存器之间、CPU和I/O端口之间的数据传送
1.通用传送指令MOV和MOVZX/MOVSX

(1)两个操作数的位数相同的传送指令MOV
功能:实现CPU内部寄存器之间的数据传送、寄存器和内存之间的数据传送,还可把一个立即数送给内部寄存器或内存单元
在这里插入图片描述
作用:
1.将BL中的8位数据送AL
2.将DX中的16位数据送ES
3.BX和BX+1的所指的两个内存单元的内容送到AX
4.AX中的16位数据送到DI和DI+1所指的两个单元
5.将1000和1001两单元的内容给CX
6.将6070H送到SI和SI+1所指的内存单元
7.将立即数5040送DX
8.将EBX+ECX*2+1000H所指单元开始的4个字节的送EAX

(2)两个操作数的位数不相同的传送指令MOVZX/MOVSX
传送的源操作数和目的操作数位数不相同时,MOVZX在传送是进行零扩展,MOVSX进行符号扩展,设BL中未80H
在这里插入图片描述
作用:
1.80H被零扩展为0000 0080H送EAX中
2.80H被符号扩展为FFFF FF80H送EAX中

注意(对通用传送指令):
1.可以传送8、16、32位数据,具体取决于指令涉及的寄存器的位数
2.通用传送指令中总是既含源操作数,又含目的操作数,两者之中至少有一个是用寄存器指出的
3.CPU不可通过立即数的大小判断立即数所占空间大小,WORD PTR代表立即数2个字节
3.不能在两个内存单元之间直接传送数据
4.不同从一个段寄存器向另一个段寄存器传送数据
5.寄存器即可作为源操作数,也可作为目的操作数,但CS、IP、EIP寄存器不能作为目的操作数(不能随便修改)
6.用EBX、ESI、EDI、BX、SI、DI来间接寻址时,默认的段寄存器为DS,而用EBP、ESP、BP、SP来间接寻址时,默认的段寄存器为SS
7.当执行给SS寄存器赋值的传送指令时,系统会自动禁止外部中断,等到本条指令和下条指令执行之后,又自动恢复对SS寄存器赋值前的中断开放情况

2.堆栈操作指令PUSH/POP、PUSHA/POPA和PUSHAD/POPAD

计算机运行中需要设置堆栈,堆栈是内存中的特殊存储区,按照“先进后出、后进先出”的规则存取数据。对寄存器值的保存和恢复需要由堆栈操作指令来完成
(1)普通堆栈操作指令PUSH/POP
PUSH指令把一个2字节或4字节的数据推入堆栈,操作数即为立即数,也可为寄存器和存储器中的数据推入堆栈(CPU在不能判断时仅能PUSH两个字节)
栈顶在上,栈底在下
在这里插入图片描述
作用:
1.将EAX的内容推入堆栈,栈顶为低位字节,栈指针减4
2.将CS的内容推入堆栈
3.将BX+DI和BX+DI+1所指两单元的内容推入堆栈
4.将立即数0870H推入堆栈,栈顶单元内容为70H
5.将EBX+ESI所指单元开始的4个字节推入堆栈,栈指针减4

弹出指令POP
在这里插入图片描述
作用:
1.将栈顶两单元弹出送BX,栈顶地址加2
2.将栈顶两单元弹出送ES,栈顶地址加2
3.将栈顶四单元弹出送EAX,栈顶地址加4

(2)堆栈成组操作指令PUSHA/POPA和PUSHAD/POPAD
堆栈成组操作指令由很强的功能,用一条PUSHA指令就可将8个16位通用寄存器的内容按AX,CX,DX,BX,SP,BP,SI,DI的次序推入堆栈,栈顶指针减16,栈顶单元为DI的低8位,进栈的SP内容是推入堆栈操作前的值。
而PUSHAD推入的次序为EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI
POPA/POPAD进行相反的操作

注意(堆栈操作指令):
1.按字或双字进行的,不能按字节进行,没有PUSH AL这样的操作
2.每推入一个字,堆栈地址减2,推入的数据放在栈顶,低位字节放在较低的地址单元,高位字节放在较高的地址单元(栈底),弹出指令时正好相反,每弹出1个字,栈顶指针加2
3.CS寄存器的值可推入堆栈,不能从堆栈中弹出1个值到CS寄存器
4.堆栈中的内容按后进先出的次序进行传送的,保存和恢复寄存器的内容时,要按照对称的次序执行一系列推入指令和弹出指令
在这里插入图片描述

3.累加器专用传送指令IN/OUT(输入/输出指令IN/OUT)

在主机和外部设备之间传送信息时,用输入/输出指令。对输入/输出端口的寻址有两种方式:直接寻址和利用DX寄存器的间接寻址
(1)直接的I/O指令
在这里插入图片描述
(2)间接的I/O指令
间接I/O指令执行前,必须在DX寄存器中设置好端口号
在这里插入图片描述
注意:
1.只能用累加器作为执行I/O过程的机构,不能用其他寄存器代替
2.用直接I/O指令时,寻址范围为0~255;
用间接I/O指令时,要在DX寄存器中设置好端口号,寻址范围为0~65535;
3.用间接I/O指令时,只能用DX寄存器,甚至不能用EDX!
4.每次I/O指令传输的字节数决定于累加器

4.地址传送指令LEA和LDS/LES/LSS/LFS/LGS

(1)取有效地址LEA
LEA指令的功能是将存储器的有效地址送到一个寄存器,这条指令常用来使一个寄存器作为地址指针
在这里插入图片描述
作用:
1.将有效地址2728送AX,指令执行后,AX中为2728
2.指令执行后,BX中的内容为BP+SP的值
3.如EBX=2000 0000H,ECX=1000 0000H,则执行指令后,ESI=3000 2530H
4.如BX=1000H,则执行指令后,EDI=0000 2946H(自动拓展)

注意:
1.LEA指令执行以后,目的寄存器中为内存的有效地址,而不是内存单元中的值
2.当目的寄存器位数多而数据位数少时,进行高位0拓展

(2)取段码和偏移量的指令LDS/LES/LSS/LFS/LGS
这些指令的功能相似,只是段寄存器不同,其功能是把段码和偏移量传送到2个目的寄存器
在这里插入图片描述
作用:
1.将2530H和2531H中的16位偏移量送到DI,而把2532H和2533H中的16位段码送DS
2.将1000H~1003H中的32位偏移量送到EDI,把1004H和1005H中的16位段码送ES
3.如EDX所指单元开始为78H,56H,34H,12H,BCH,9AH,则指令使ESP中为1234 5678H,SS中为9ABCH
4.把[EDX]所指单元开始的6个字节送EDX和FS
5.把[EDX]所指单元开始的6个字节送ESI和GS

注意:
1.随着寄存器的位数不同,传送的字节数也不同
2.源操作数总是来自存储器,不过存储器的地址可能是直接指出的,也可能是间接指出的
3.尽管目的操作数只指出了存放偏移量的寄存器组,并没有出现段寄存器名,但是在指令执行以后,分别往段寄存器中传送了数据。实际上,在指令LDS、LES、LSS、LFS、LGS的操作符中指出了段寄存器名DS、ES、SS、FS、GS

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值