1. 指令后缀所表示的操作位数:
指令助记符的最后一个字母表示了指令操作的位数
例如 movl %eax, %ebx表示将寄存器eax 中的内容存放到寄存器ebx中,最后的" l "表示操作的位数为32位(32bit),其他指令后缀所代表的位数如下表所示。
后缀名 | 对应英文 | 操作位数(bit) | 指令示例 |
b | Byte | 8 | movb %al, %bl |
w | Word | 16 | movw %ax, %bx |
l | Long word | 32 | movl %eax, %ebx |
q | Quad words | 64 | movq %rax, %rbx |
2. 基础运算符介绍:
汇编语言的指令的基本格式为: <指令助记符> <操作数src> <操作数dst> ;<注释>
其中操作数的种类有三种:寄存器,内存地址,立即数,左边的操作数为源操作数,右边的操作数为目标操作数,两个操作数不能同为内存地址。注释由分号 ; 申明。
示例:
movl %eax, %ebx ; 将寄存器eax中的内容存放到ebx中
movl %eax, (%ebx) ; 将寄存器eax中的内容存放到ebx寄存器中的值指向的内存地址中
movl $32 , %ebx ; 将立即数32存放到寄存器中
3. 内存寻址介绍:
内存寻址的一般表现形式:Imm( rb , ri , s ),其中Imm表示偏移的立即数,rb为内函基地址的寄存器,ri为变地址寄存器,s为比例因子,地址的计算公式为:
例:
movl $0x8000, %ebx ; 将立即数0x8000(16进制)存入寄存器ebx中
movl $0x3, %ecx ; 将立即数0x3(16进制)存入寄存器exc中
movl %eax, -32(%ebx, %ecx, 4) ; 将寄存器eax中的内容存放到 -32 + 0x8000 + 0x3 * 4中
4. 一些算数运算符介绍:
inc ; increase 累加,类似于i++
dec ; decrease 累减,类似于i--
neg ; negative 取反,逐位取反再+1
add ; addition 加法
sub ; subtraction 减法
mul ; multiply 无符号数乘法
imul ; 有符号数乘法
div ; division 无符号数除法
idiv ; 有符号数除法,(在汇编中乘除法会尽量被优化为位移运算)
5. 其他的一些指令:
lea : 降label对应的地址装入寄存器中
举例:
.section .data ;定义数据段
value1:
.string "String\n"
leal value1, %esi ;将数据段value1的地址存入寄存器esi中
movl $value1, %esi ; “$+段名” 同样表示取段地址,因而本式同上面的式子等价