汇编指令【下】
2016-04-09 13:23
375 查看
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
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
相关文章推荐
- 查找最大元素(HDU2025)
- latex学习3:教你如何在word中像LaTex那样打公式
- Android 增强版百分比布局库 为了适配而扩展
- Mysql中使某个用户只能访问指定的数据库
- 读[查询优化改写 技巧与案例]一书有感
- Netty in Action (九) 第四章节 第二部分 transport API
- java中调用xml的方法:DocumentBuilderFactory
- 三年的你应该这样
- ISBN号码
- 新的小组信息以及项目名称与介绍
- oracle imp dmp
- 递归算法&求数组最大值、求N阶乘
- Camel Splitter分配器以及Aggregate聚合器使用实例
- 《JAVA并发编程实践》学习笔记(第十.十一章)
- python小工具:检索目录大小
- 动态时钟的时间设置
- custom struts framework
- 关于Struts2的部分详解
- qcow2、raw、vmdk等镜像格式的比较和基本转换
- myeclipse 10优化