Linux kernel 系列 汇编

通用寄存器
EAX累加(函数默认使用这个寄存器作为返回值)
EBX基地址
ECX计数
EDX数据
EBP堆栈
ESI变址
EDI
ESP堆栈顶指针
段寄存器
CS代码段
DS数据段
ED附加段
SS堆栈段
FS附加段
GS附加段
 
常见的汇编指令
Memory instruction: MOV\PUSH\POP\ETC
sub(减) add(加)
其中后面添加b8位\w16位\l32位\q64位
举例
movl %eax ,%edx将eax的内容放到edx中,相当于edx=eax;
movl 0x653, 立即寻址
movl 0x352 ,%edx edx=(int32_t)0x123;直接寻址
movl (%ebx) ,%edx edx=(int32_t)ebx;间接寻址
movl 4(%ebx),%edx edx=(int32_t)(ebx+4);变址寻址
pushl %eax将eax压到栈顶(栈实际上是倒着的,所以压入一个值,地址减小一个单位)
popl %eax取栈顶
call 0x12565比较特别,相当于pushl eip()movl 0x12565,%eip(*),eip是cpu指令指针,相当于在当前指令前插入一个指令0x12565
ret popl %eip(*)
以上两个函数相当于一次函数调用,中间跳转执行另一个函数,然后返回回来
一段代码汇编对比

int g(int x)
{
    return x*2+3;
}
 
int f(int x)
{
    return g(x);
}
 
int main(void)
{
    return f(8)+1;
}

        @ args = 0, pretend= 0, frame = 8
        @ frame_needed = 1, uses_anonymous_args= 0
        stmfd  sp!, {fp, lr}
        add    fp, sp, #4
        sub    sp, sp, #8
        str    r0, [fp, #-8]
        ldr    r0, [fp, #-8]
        bl     g
        mov    r3, r0
        mov    r0, r3
 
        sub    sp, fp, #4
        ldmfd  sp!, {fp, pc}
        .size  f, .-f
        .align 2
        .global main
        .type  main, %function
main:
        @ args = 0, pretend = 0, frame = 0
        @ frame_needed = 1, uses_anonymous_args= 0
        stmfd  sp!, {fp, lr}
        add    fp, sp, #4
        mov    r0, #8
        bl     f
        mov    r3, r0
        add    r3, r3, #1
        mov    r0, r3
        ldmfd  sp!, {fp, pc}
        .size  main, .-main
        .ident “GCC: (Debian 4.6.3-14+rpi1) 4.6.3”
        .section        .note.GNU-stack,”“,%progbits

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值