汇编语言中 MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. 这个 符号扩展和零扩展时啥意思?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编语言中 MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. 这个 符号扩展和零扩展时啥意思?相关的知识,希望对你有一定的参考价值。
菜鸟做单片机工作!!
零扩展就是前面用0补齐符号扩展就是:如果最高位是0,则用0补齐;是1则用1补齐
如:
8位的+1,表示为二进制为00000001,补成16位的话,零补齐为0000000000000001,符号补齐为0000000000000001
8位-1,表示成二进制为11111111,补成16位的话,零补齐为0000000011111111,符号补齐为1111111111111111 参考技术A 16位二进制 0xFFFF(有符号数-1, 无符号数65535) 最高位是1,
零扩展成32位变为 0x0000FFFF (无符号数65535)
符号扩展成32位: 0xFFFFFFFF (有符号数-1) 参考技术B 零扩展成32位变为 0x0000FFFF (无符号数65535)
符号扩展成32位: 0xFFFFFFFF (有符号数-1)
8086到80386汇编数据传送指令的扩展
80386及以上汇编的数据传送指令如下;
MOV 传送字或字节.
MOVSX 先符号扩展,再传送.
MOVZX 先零扩展,再传送.
PUSH 把字压入堆栈.
POP 把字弹出堆栈.
PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.
POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.
PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.
POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.
BSWAP 交换32位寄存器里字节的顺序
XCHG 交换字或字节.(至少有一个操作数为寄存器,段寄存器不可作为操作数)
CMPXCHG 比较并交换操作数.(第二个操作数必须为累加器AL/AX/EAX)
XADD 先交换再累加.(结果在第一个操作数里)
XLAT 字节查表转换.----BX指向一张256字节的表的起点,
AL为表的索引值(0-255,即0-FFH);
返回AL为查表结果.([BX+AL]->AL)
已经比8086扩展了一些;
8086的数据传送指令如下;
1. MOV(传送)
2. XCHG(交换)
3. LEA(装入有效地址)
4. LDS/LES/LGS/LFS/LSS
5. PUSH(进栈)
6. POP(出栈)
7. PUSHF/POPH
8. LAHF/SAHF(标志寄存器传送指令)
9. XLAT(汇编语言查表指令)
使用emu8086来看一下;
MOVSX AX, CL 这条8086已经不能识别;
BSWAP 这条肯定是80386及以后的,交换32位寄存器里字节的顺序,是针对32位寄存器的;
PUSHAD是386及以后的,在emu8086中输入,8086识别的显示为蓝色,不识别的显示为黑色;
XLAT,汇编语言查表指令,这条是一直都有的;
LEA,LDS,LAHF 也是一直有的;
别的自己看吧;
以上是关于汇编语言中 MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. 这个 符号扩展和零扩展时啥意思?的主要内容,如果未能解决你的问题,请参考以下文章