汇编指令【下】

pusha push ax cx dx bx sp bp si di与pushad 类似
popa = pop di si bp sp bx dx cx ax

操作的是十六位寄存器
eax 是三十二位寄存器 ax 是十六位寄存器
下面验证一下 eax ax到底有毛关系
eax = 754033b8
esp = 0018ff8c 内容 754033ca
push ax
esp就会 -2个字节 esp = 0018ff8a
看看这里保存的内容是什么吊东西
0018ff8a内容 0000ca33
现在执行push ax 看看这几个寄存器的变化
执行过后
esp = 0018ff8a 内容33ca33b8
push ax 将 33b8 保存到 0018ff8a
0018ff8a 内容 b8
0018ff8b 内容 33
eax 保存的值 754033b8 ax 的值就是33b8 保存到esp中的顺序从右向左开始保存的!!

MOV
该指令将第二个操作数赋值给第一个操作数
mov eax,ebx 就会将ebx的值赋值给eax
试试
eax = 754033b8
ebx = 7efde000
mov eax,ebx
执行完过后 eax = 7efde000
ebx = 7efde000

mov al,cl 将cx的低八位 赋值给ax的低八位
低八位是左边还是右边这个真不知道
做个测试
eax 7efde000 ax = e000
ecx 12345678 cx = 5678
执行完过后
eax = 7efde078 ax = e078 低八位在右边 al = 78
ax = e000 低八位al = 00
cx = 5678 cl = 78
寄存器做右向左 就是从低到高

AL-是EAX的最后两位数字以及CL-是ECX的最后两位数字

现在我们试试内存单元
mov ax,word ptr ds:[405008]
将这个内存单元的内容赋值给ax
405008里的内容 08 30 0f 30
eax = 7efde078
执行过后eax = 7efd3008
也就是将08 30 存储到了ax中去 是从右向左存储的数据

mov ax,dword ptr ds:[405008]
会发生什么东西呢,人要敢于尝试
没法odb 有检查功能不让这么干,估计这个程序会报错

mov al,byte ptr ds:[405008]
就是将第一个字节存储到al中去 al是eax最右边的两位记住哦

我们来试试其它扩展的mov指令
MOVSX (带符号扩展的传送指令)
第二个操作数可能一个寄存器也可能是内存单元,第一个操作数的位数比第二个操作数多,
第二个操作数的符号位填充第一个操作数剩余部分。
符号位什么吊东西,我不知道,先搞个例子,再猜!
movsx eax,bx
eax = 7efd3008
ebx = 7efde000 bx = e000
执行完了
eax = ffffe000
将bx的值赋给了ax
剩下的都用f去填充了
f就是符号位了
为啥bx的符号位是f呢?
你妹的没基础就跟白痴一样,符号位都不知道真是干,我去百度看看!
符号位就是正负!
e000 是个十六位的二进制数 2个字节
有符号的十六位数就是-32768-32767的范围
ffff表示-32768
e000 转换为二进制数1110000000000000 如果是有符号的数第一位是1
就是负数
是0就是正数
所以ax的其它位用1填充 就是ffff了

16位数的范围是0000到FFFF。0000到7FFF是正数,8000到FFFF是负数。

MOVZX (带0扩展的传送指令)
movzx eax bx

第二个操作数的位数小于第一个操作数的位数 剩余位用0去填充 不需要去判断正负了
省心

LEA (取地址指令)
类似于MOV指令, 但是第一个操作数是一个通用寄存器,并且第二个操作数是一个内存单元。
当计算的时候要依赖于之前的结果的话,那么这个指令就非常有用。
lea eax,[405088]
405088内容 7e348434
eax = ffffe000
执行完之后 我操 eax = 405088
人家只要获取后面内存单元的地址,不要内容,我白操心了。

XCHG (交换 寄存器/内存单元 和 寄存器)
交换两个操作数的值
想想编程还得写几条语句呢,一条指令搞定真是伤心
xchg eax,ecx
eax = 00405088
ecx = 12345678
执行完之后
eax = 12345678
ecx = 00405088

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值