汇编速查-IA32指令系统
来源:互联网 发布:比较好的java培训机构 编辑:程序博客网 时间:2024/06/04 21:32
1 数据传送指令
格式:MOVX source, destination
X: L 32位值 W 16位值 B 8字节
MOVL %EAX, %EBX
MOVW %AX, %BX
MOVB %AL, %BL
使用规则,mov只有以下13种情况
变址寻址
地址格式: base_addr(offset_addr, index, size)
数据值位于base_addr + offset_addr + index * size
offset_addr,index必须为寄存器值,size可以是数字值
movl $2, %edimovl values(, %edi, 4), %eax
寄存器间接寻址
$
加标签获取内存位置的地址
movl $values, %edi ;把values地址送进EDImovl %ebx, (%edi) ;把EDX值送到EDI中包含的内存位置处movl %ebx, 4(%edi) ;把值放到EDI寄存器指向位置之后4个字节的内存位置处movl %ebx, -4(%edi);把值放到EDI寄存器指向位置之前4个字节的内存位置处
2 条件传送指令
条件传送指令可以避免处理器执行JMP指令,这有助于处理器的预取缓存状态,通常能提高应用程序的速度
指令格式 : CMOVX source, destination
X是1个或2个字母的代码,表示将触发传送操作的条件;
条件取决于EFLAGS寄存器当前值 使用的位
3 交换数据
XCHG OP1, OP2
op1和op2可以同时为通用寄存器或者一个是内存位置(不能同时为内存位置)
8 bit, 16 bit, 32 bit寄存器都可以使用
当其中一个操作数是内存位置时,处理器LOCK信号自动标明,防止交换过程中其他处理器访问这个内存位置。
LOCK是非常耗时间的,并且可能对程序性能有不良影响。
BSWAP REG
反转寄存器字节顺序,大端变小端
XADD SOURCE, DESTINATION
交换两个寄存器的值或寄存器和内存位置的值,然后相加存到destination中
CMPXCHG SOURCE, DESTINATION
如果destination和EAX/AX/AL相等,把source加载到destination;
否则,把destination加载到EAX/AX/AL中
CMPXCHG8B DESTINATION
如果destination处8字节和EDX:EAX包含值匹配,ECX:EBX中64位值加载到destination内存位置;
否则destination内存位置值加载到EDX:EAX中。
4 堆栈
压栈 pushx source
X:l用于长字32bit,w用于半字16bit
操作数是
16bit/32bit 立即数值
16bit/32bit 内存值
16bit/32bit 寄存器值
16bit 段寄存器
e.g.
pushl %ecxpushw %cxpushl $100pushl data ;push data值 pushl $data ;push data的地址
出栈 popx destination
16bit/32bit 寄存器
16bit 段寄存器
16bit/32bit 内存位置
e.g.
popl %ecxpopw %cxpopl value
ESP寄存器是堆栈指针跟踪着堆栈的开始位置
压入和弹出所有寄存器
PUSHA
压入16位寄存器 顺序DI, SI, BP, BX, DX, CX, AX PUSHAD
压入32位寄存器 顺序EDI, ESI, EBP, EBX, EDX, ECX, EAX
手动使用ESP,EBP手工把数据放入堆栈
通常 很多程序把ESP值复制到EBP,而不是使用ESP本身
优化内存访问:奔腾四的处理器中,缓存块长度是64bit,定义的数据超过64位,就需要两次访存操作。
5 控制执行流程
无条件分支 : 跳转;调用;中断
跳转
汇编程序不认为跳转是不良的程序设计,对程序的性能有影响 jmp location
location是要跳转到的内存地址,被声明为代码中的标签;
遇到跳转时指令指针改编为紧跟在标签后面的指令码的内存地址。
调用
保存发生跳转的位置,并且具有在需要时返回这个值的能力 call address
:引用程序中的标签,他被转换为函数中的第一条指令的地址
返回指令RET
没有操作数,通过查看堆栈,它知道返回什么位置
函数调用模板
Function_label:Pushl %ebpMovl %esp, %ebp<normal code>Movl %ebp, %espPopl %ebpRet
e.g.
;calltest.s;An example of using the CALL instruction.section .dataoutput: .asciz "This is section %d\n".section .text.globl _start_start: pushl $1 pushl $output call printf add $8, %esp call overhere pushl $3 pushl $output call printf add $8, %esp pushl $0 call exitoverhere: pushl %ebp movl %esp, %ebp pushl $2 pushl $output call printf add $8, %esp movl %ebp, %esp popl %ebp ret
中断
硬件中断/软件中断
软件中断 :系统调用 INT 0x80
6 条件分支
jxx address
比较指令 cmp op1, op2
op2-op1,比较指令不会修改这两个操作数的值
7循环指令
循环指令只支持8位偏移量,只支持短跳转
Betterloop.s
;betterloop.s - An example of the loop and jcxz instructions.section .dataoutput: .asciz "The value is: %d\n".section .text.globl _start_start: movl $0, %ecx xor %eaxmovl $0, %eax@@@TE: Point taken, instruction changed. Thanks. – RKB@@@ jcxz doneloop1: addl %ecx, %eax loop loop1done: pushl %eax pushl $output call printf movl $1, %eax movl $0, %ebx int $0x80
汇编程序 分支的性能优化 略 P122
8 基本数学功能
整数运算
ADDX src, des 加法
src+des->des src可以是立即值,内存位置或寄存器;
des可以是寄存器或内存位置中的值。不能同时为内存中的值
x:l,w,b;
不使用32位寄存器要用0填充
ADCX src, des 进位加法,带进位
src可以是立即值,内存位置或寄存器;
des可以是寄存器或内存位置中的值。
不能同时为内存中的值
SUBX src, des
Src-des->des src可以是立即值,内存位置或寄存器;
des可以是寄存器或内存位置中的值。
不能同时为内存中的值
x:l,w,b;
不使用32位寄存器要用0填充
SBBX src, des 进位减法
src可以是立即值,内存位置或寄存器;
des可以是寄存器或内存位置中的值。
不能同时为内存中的值
递增/递减
inc/dec destination
destination可以是8bit/16bit/32bit寄存器,或者内存中的值
乘法
MULX source ,source可以是8bit/16bit/32bit寄存器,或者内存中的值
目标位置隐含,是EAX/AX/AL,具体是哪一个取决于source的长度
16bit x 16bit结果存放在 DX:AX中
32bit x 32bit结果存放在 EDX:EAX中
带符号乘法
IMULX src 和MUL一样
IMULX src, des 定义了des,des必须为通用寄存器,结果被限制为单一目标寄存器的长度(并不是64bit)
IMULX mutiplier, src, des ;
mutiplier立即值,src 16b/32b寄存器或内存中的值,des通用寄存器,des = src * multiplier
除法
无符号除法
divisor是除数,可以是8bit/16bit/32bit寄存器,或者内存中的值
除数的最大值,16bit被除数,除数最大8bit;32bit被除数,除数最大16bit;32bit被除数,除数最大16bit
有符号除法
IDIVX divisor ;divisor是除数,可以是8bit/16bit/32bit寄存器,或者内存中的值
IDIV指令把结果返回和DIV指令相同的寄存器中,并且商和余数的格式也一样
对于带符号的除法,余数的符号和被除数一致
移位运算
移位乘法/向左算数/逻辑移位
SALX/SHLX des 左移1位
SALX/SHLX %cl, des左移CL寄存器指定的位数
SALX/SHLX shifter, des 左移shifter(立即数)指定的位数
移位除法
SHR 逻辑右移
SAR 算数右移
循环移位
十进制运算
略
逻辑操作
AND src, des
OR src, des
XOR src, des ;位操作
Src可以是8bit/16bit/32bit 立即数,8bit/16bit/32bit寄存器,或者内存中的值
des可以是8bit/16bit/32bit寄存器,或者内存中的值;不能同时为内存中的值
NOT op ;op是源操作数也是目的操作数
位测试
TEST src, des ;8b/16b/32b数据之间进行按位逻辑与操作,并相应的设置符号,零和奇偶校验标识,而不修改目标操作数。
- 汇编速查-IA32指令系统
- 汇编速查-IA32汇编helloword
- 汇编速查-IA32寄存器组织
- 汇编指令系统
- 汇编-指令系统
- 8086/8088汇编指令系统
- 单片机之汇编指令系统
- 80x86汇编指令系统
- 汇编速查-内联汇编
- [汇编]8086指令系统---逻辑指令
- 汇编(二)8086指令系统
- 8088汇编速查
- 汇编指令速查
- 汇编指令速查
- 汇编速查
- 汇编指令速查
- 汇编指令速查
- 汇编指令速查
- 微信PHP的常用函数(二)
- 关于mongoVue添加、导入数据
- 3#使用plsql工具导出oracle数据库数据
- 谷歌浏览器 扩展程序
- 设计模式 二
- 汇编速查-IA32指令系统
- 10进制转16进制
- 回环接口 loopback
- PHP的常用函数(三)
- java动态代理(JDK和cglib)
- apache 开启Gzip网页压缩
- 横竖屏切换时候的生命周期以及configchanges介绍
- ด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็
- 关于Pairs(对组)