64位汇编之linux系统调用

linux系统中64位汇编和32位汇编的系统调用主要有以下不同:
(1)系统调用号不同.比如x86中sys_write是4,
sys_exit是1; 而x86_64中sys_write是1, sys_exit是60。 linux系统调用号实际上定义在/usr/include/asm/unistd_32.h和/usr/include/asm/unistd_64.h中。
(2)系统调用所使用的寄存器不同,x86_64中
使用与eax对应的rax传递系统调用号,但是   x86_64中分别使用rdi/rsi/rdx传递前三个参数,而不是x86中的ebx/ecx/edx。

(3)系统调用使用“syscall”而不是“int 80”。


一个简单的输出命令行参数的程序

    .text
    .globl _staet

    _staet:
    popq %rsi

    vnext:
    popq %rsi
    test %rsi, %rsi
    jz exit
    movq %rsi, %rdi
    xorq %rdx, %rdx

    strlen:
    movb (%rdi), %al
    inc %rdx
    inc %rdi
    test %al, %al
    jnz strlen
    movb $10, -1(%rdi)
    movq $1, %rax
    movq $1, %rdi
    syscall
    jmp vnext

    exit:
    movq $60, %rax
    movq $0, %rdi
    syscall

    ret


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值