您的位置:首页 > 其它

汇编速查-IA32指令系统

2016-11-22 15:19 363 查看

1 数据传送指令

格式:MOVX source, destination

X: L 32位值 W 16位值 B 8字节

MOVL %EAX, %EBX

MOVW %AX, %BX

MOVB %AL, %BL

使用规则,mov只有以下13种情况

情况举例
立即数==>通用寄存器movl $0, %eax
立即数==>内存位置movl $100, value
通用寄存器==>通用寄存器movb $al, %cl
通用寄存器==>段寄存器movl %edx, %cs
通用寄存器==>控制寄存器movl %edi, %cr0
通用寄存器==>调试寄存器movl
段寄存器 ==>通用寄存器movl %ds, %esi
控制寄存器==>通用寄存器movl %cr4, %esp
调试寄存器==>通用寄存器
内存位置==>通用寄存器movl value, %eax
内存位置==>段寄存器
通用寄存器==>内存位置movl %ecx, value
段寄存器 ==>内存位置

变址寻址

地址格式: base_addr(offset_addr, index, size)

数据值位于base_addr + offset_addr + index * size

offset_addr,index必须为寄存器值,size可以是数字值

movl $2, %edi
movl values(, %edi, 4), %eax


寄存器间接寻址

$
加标签获取内存位置的地址

movl $values, %edi ;把values地址送进EDI
movl %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   %ecx
pushw  %cx
pushl  $100
pushl   data  ;push data值
pushl   $data ;push data的地址


出栈 popx destination

16bit/32bit 寄存器

16bit 段寄存器

16bit/32bit 内存位置

e.g.

popl   %ecx
popw  %cx
popl   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 %ebp
Movl %esp, %ebp
<normal code>
Movl %ebp, %esp
Popl %ebp
Ret


e.g.

;calltest.s
;An example of using the CALL instruction

.section .data
output:
.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 exit
overhere:
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 .data
output:
.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 done
loop1:
addl %ecx, %eax
loop loop1
done:
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数据之间进行按位逻辑与操作,并相应的设置符号,零和奇偶校验标识,而不修改目标操作数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  汇编