这篇文章简单介绍下kernel中汇编的一些小的基础知识。
基础
- movl 0xc(%ebp), %eax相当于eax = *(int32_t *)(ebp+12)
- 在32位x86系统中,ebp指向寄存器栈底。 3.
习题
- 假定当前是32位X86机器,ebp寄存器的值为12,esp寄存器的值为8,执行完如下代码后esp的值是多少?(答案单位为字节,填入数值即可) pushl %ebp
4
- 假定当前是32位x86机器,eax寄存器的值为0x1234,ebx寄存器的值为0x4321,执行完如下代码后eax的值是多少?ebx的值是多少? movl %eax, %ebx
0x1234 0x1234 - 正确
0x1234 0x1234 - 正确
- 下面哪条指令的寻址方式是直接寻址方式?
movb 0x12, %ah
movw $0x123, %ax
movl (%ebx), %edx
movl %eax, %edx
movl %eax, %edx
选a.
-
32 位x86 CPU中,cs:eip指向要执行的指令地址,所以想执行0x123处的代码,我们可以通过mov $0x123, %eip指令来跳转 错误。%eip不能直接寻址,必须经过寄存器传值。
-
与下面两条指令等价的指令是(): pushl %ebp movl %esp, %ebp
(enter)
- 假定当前是32位X86机器,函数的返回值默认使用哪个寄存器来返回给上级函数?比如eax、ebx、ebp、esp、eip、esi、edi等等(eax)