大纲
- 汇编与c之间的数据类型
- 常见的汇编语法(AT&T)
汇编语言的数据格式 字 2byts
| c声明 | Intel数据类型 | 汇编代码后缀 | 大小(字节x86-32) |
|---|
| char | 字节 | b | 1 |
| short | 节 | w | 2 |
| int | 双字 | l | 4 |
| unsigned | 双字 | l | 4 |
| char * | 双子 | l | 4 |
| long int | 双字 | l | 4 |
| double | 双精度 | l | 8 |
| long long int | - | - | |
| float | 单精度 | s | 4 |
| long double | 扩展精度 | t | 10/12 |
| c声明 | Intel数据类型 | 汇编代码后缀 | 大小(字节x86-64) |
|---|
| char | 字节 | b | 1 |
| short | 节 | w | 2 |
| int | 4字 | q | 4 |
| unsigned | 4字 | q | 4 |
| char * | 双子 | l | 8 |
| long int | 双字 | l | 8 |
| double | 双精度 | l | 8 |
| long long int | - | 4 | |
| float | 单精度 | q | 4 |
| long double | 扩展精度 | t | 16 |
常见的汇编语法(AT&T)
mov: source地址会访存
movl Source,Dest; 不可以 movl (%eax),(%ebx); 部可以两个操作数都是内存地址
movl $0x4,%eax;
movl $-147,(%eax) ==> *p = -147;
movsl 带符号为扩展
movzl 零扩展
cmovl 条件转移指令 gcc -march=i686 gcc 3.4.4
cmovl Src, Dec; 如果上一个条件满足,则将src传入dec,不满足则dec传入src
地址计算指令
leal Src,Dest 进行的地址计算 传递地址
栈操作指令
pushl %ebp 将old%ebp入栈,然后movl -4(%esp),%esp
pop %eax 将%esp所指向的值放入%eax中 ,然后movl 4(%esp),%esp
算术操作指令
双操作数
### addl Src,Dest
### subl Src,Dest Dest = Dest - Src
### imull Src,Dest
### sall Src,Dest 左移
### sarl Src,Dest 算术右移 --补符号位
### shrl Src,Dest 逻辑右移 ---补零号
### xorl Src,Dest 异或
### andl Src,Dest 与
### orl Src,Dest 或
单操作数
incl dest 自加
decl dest 自减
negl dest 负号
notl dest 取反
- CF carry clag 进位
- ZF zero flag 等于零
- SF sign flag 符号位
- OF overflow flag 溢出位
跳转指令
| JX | Condition | DEscription | 大小(字节x86-64) |
|---|
| jmp | 1 | | |
| je | ZF | | |
| jne | ~ZF | | |
| js | SF | | |
| jns | ~SF | | |
| jg | (SF^OF)&ZF | | |
| jge | ~(SF^OF) | | |
| jl | (SF^OF) | | |
| jle | SF^OF) | ZF | | |
| ja | ~CF&ZF | | |
| jb | CF | | |
| | | |
set:读取条件码,并存入** 字节寄存器 **
| SetX | Condition | Description |
|---|
| -sete | ZF | |
| -setne | ~ZF | |
| -sets | SF | |
| -setns | ~SF | |
| -setb | CF | Above(Unsigned) |
| -seta | ~CF&ZF | Below(Unsigned) |
| -setl | (SF^OF) | signed |
| -setg | (SF^OF)&ZF | sign |
| -setge | ~(SF^OF) | sign |
| -setle | SF^OF) | ZF | sign |
trick:其实只需要记住常用的几条就行了
如 cmpl a,b;
jg L0; 就是当b-a >0时 跳 L0
cmpl a,b;
jl L0; 当 b-a <= 0时 跳转 L0
cmpl a,b;
jz L0 当 b-a = 0 时 跳转L0
如果有需要可以参考
https://www.cnblogs.com/jokerjason/p/9578646.html