X86 AT&T常用寄存器及其操作指令
Posted 之墨_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了X86 AT&T常用寄存器及其操作指令相关的知识,希望对你有一定的参考价值。
X86 AT&T常用寄存器及其操作指令
常用寄存器
- esp寄存器:当我们需要访问堆栈帧中的变量时,可以使用esp寄存器来获取堆栈帧的基址,以便能够正确地访问堆栈帧中的变量。
- ebp寄存器:当我们需要调用一个函数时,可以使用ebp寄存器来获取函数的参数,以便能够正确地传递参数给函数。
- eax寄存器:当我们需要调用一个函数时,可以将函数的参数存储在eax寄存器中,以便函数能够正确地接收参数。
- ebx寄存器:当我们需要访问一个数组时,可以将数组的基址存储在ebx寄存器中,以便能够正确地访问数组。
- ecx寄存器:当我们需要实现一个循环时,可以将循环的计数器存储在ecx寄存器中,以便能够正确地实现循环。
- edx寄存器:当我们需要实现乘除法运算时,可以将乘除法运算的结果存储在edx寄存器中,以便能够正确地实现乘除法运算。
- esi寄存器:当我们需要实现字符串复制时,可以将源地址存储在esi寄存器中,以便能够正确地实现字符串复制。
- edi寄存器:当我们需要实现字符串复制时,可以将目的地址存储在edi寄存器中,以便能够正确地实现字符串复制。
- eip寄存器:当我们需要实现跳转到另一个函数时,可以将下一条指令的地址存储在eip寄存器中,以便能够正确地实现跳转。
操作指令
操作这些寄存器的指令有:mov、add、sub、inc、dec、cmp、xchg、push、pop、lea、jmp、call等。
- mov指令:用于将源操作数的值复制到目标操作数中,例如:movl %eax, %ebx,表示将eax寄存器中的值复制到ebx寄存器中。
- 例子1:movl $0x1, %eax,这条指令将值0x1存储到寄存器eax中。
例子2:leal 0x1(%ebx), %eax,这条指令将ebx + 0x1的地址存储到寄存器eax中。
在这两个例子中,movl指令将值0x1存储到eax中,而leal指令将ebx + 0x1的地址存储到eax中。
- 例子1:movl $0x1, %eax,这条指令将值0x1存储到寄存器eax中。
- add指令:用于将源操作数的值与目标操作数的值相加,例如:addl %eax, %ebx,表示将eax寄存器中的值与ebx寄存器中的值相加。
- sub指令:用于将源操作数的值减去目标操作数的值,例如:subl %eax, %ebx,表示将eax寄存器中的值减去ebx寄存器中的值。
- inc指令:用于将操作数的值加1,例如:incl %eax,表示将eax寄存器中的值加1。
- dec指令:用于将操作数的值减1,例如:decl %eax,表示将eax寄存器中的值减1。
- cmp指令:用于比较源操作数的值与目标操作数的值,例如:cmpl %eax, %ebx,表示比较eax寄存器中的值与ebx寄存器中的值。
- xchg指令:用于交换源操作数的值与目标操作数的值,例如:xchgl %eax, %ebx,表示交换eax寄存器中的值与ebx寄存器中的值。
- push指令:用于将操作数的值压入堆栈,例如:pushl %eax,表示将eax寄存器中的值压入堆栈。
- pop指令:用于将堆栈中的值弹出到操作数中,例如:popl %eax,表示将堆栈中的值弹出到eax寄存器中。
- lea指令:用于将操作数的值赋值给另一个操作数,例如:leal (%eax, %ebx), %ecx指令的作用是将eax + ebx的地址存储到ecx中。
- jmp指令:用于跳转到指定的地址,例如:jmpl 0x12345,表示跳转到地址0x12345处。call指令:用于调用指定的函数,例如:calll 0x12345,表示调用地址0x12345处的函数。
- 加减乘除操作可以使用add、sub、mul、div指令来实现
- 例如:addl %eax, %ebx,表示将eax寄存器中的值与ebx寄存器中的值相加;
- subl %eax, %ebx,表示将eax寄存器中的值减去ebx寄存器中的值;
- mull %eax, %ebx,表示将eax寄存器中的值与ebx寄存器中的值相乘;
- divl %eax, %ebx,表示将eax寄存器中的值除以ebx寄存器中的值。
- 例如:imull $2, %eax,表示将eax寄存器中的值乘以2。
- 可以使用shl指令来实现寄存器的值乘以2的幂次方,例如:shll $2, %eax,表示将eax寄存器中的值乘以4(2的2次方)
- movl (%ebx,%eax,4), %ebx指令的作用是将ebx寄存器中的值加上eax寄存器中的值乘以4后的结果,作为ebx寄存器的新值。
示例
pushl %ebp://将ebp的值压入堆栈
movl %esp, %ebp://将esp的值赋给ebp
subl $24, %esp://从esp中减去24,以便为变量分配内存
andl $-16, %esp://将esp的值与-16进行按位与运算,以确保内存对齐
movl $0, %eax://将0存入eax
subl %eax, %esp://从esp中减去eax的值,以便为变量分配内存
movl $0, -20(%ebp)://将0存入ebp-20处的内存
movl $0, -16(%ebp)://将0存入ebp-16处的内存
movl $1, -12(%ebp)://将1存入ebp-12处的内存
movl $2, -12(%ebp)://将2存入ebp-12处的内存
movl $3, -8(%ebp)://将3存入ebp-8处的内存
movl $0, %eax://将0存入eax
leave://恢复ebp的值
ret://返回
以上是关于X86 AT&T常用寄存器及其操作指令的主要内容,如果未能解决你的问题,请参考以下文章
AT&T x86 | `xadd %eax, (%ecx)` 有啥作用?