64在编写命令行参数时遇到困难,返回

我正在使用elf64编译并尝试取出一个参数并将其写入控制台。

我将这个函数称为./test wooop

在使用gdb之后,似乎没有问题,一切都设置好了:

rax:0x4 rbx:0x1 rcx:指向字符串,x / 6cb $ rcx给出'w''o''o''o''p'0x0 rdx:0x5 <---正确确定长度

int 80h rax包含-14后没有任何内容被打印到控制台。 如果我在.data中定义一个字符串,它就会起作用。 gdb以相同的方式显示$ rcx的值。

有任何想法吗? 这是我的全部来源

    %define LF      0Ah
    %define stdout      1
    %define sys_exit    1
    %define sys_write   4


    global _start

    section .data

    usagemsg: db "test {string}",LF,0

    testmsg: db "wooop",0

    section .text

    _start:

    pop rcx     ;this is argc
    cmp rcx, 2      ;one argument
    jne usage
    pop rcx
    pop rcx               ; argument now in rcx
    test    rcx,rcx
    jz usage

    ;mov rcx, testmsg    ;<-----uncomment this to print ok!

    call print
    jmp exit


    usage:
    mov rcx, usagemsg
    call print
    jmp exit


    calclen:

    push rdi
    mov rdi, rcx
    push rcx
    xor rcx,rcx
    not rcx
    xor al,al
    cld
    repne scasb
    not rcx  
    lea rdx, [rcx-1]
    pop rcx
    pop rdi
    ret

    print:

    push rax
    push rbx
    push rdx

    call calclen

    mov rax, sys_write
    mov rbx, stdout
    int 80h
    pop rdx
    pop rbx
    pop rax
    ret

    exit:
    mov rax, sys_exit
    mov rbx, 0
    int 80h

谢谢

编辑:改变后我如何让我的系统调用如下,它工作正常。 感谢你的帮助!

sys_write现在是1
sys_exit现在是60
stdout现在进入rdi,而不是rbx
要写入的字符串现在设置为rsi,而不是rcx
int 80h被syscall替换


我仍在运行32位硬件,所以这是一个疯狂的猜测! 正如你可能知道的,64位系统调用号码是完全不同的,并且使用“syscall”而不是int 80h。 但是仍然可以使用int 80h和32位系统调用编号,并将64位寄存器截断为32位。 您的测试表明,这可以与.data中的地址一起使用,但是使用“堆栈地址”时,它会返回-14(--EFAULT - 坏地址)。 我唯一能想到的是,截断rcx到ecx会导致“不良地址”,如果它在堆栈中。 我不知道堆栈在64位代码中的位置。 这有意义吗?

我会用“正确”的64位系统调用号码和寄存器以及“系统调用”来尝试它,看看是否有帮助。

最好,弗兰克


正如你所说,你使用ELF64作为编译的目标。 不幸的是,这是你的第一个错误。 在Linux上使用“旧”系统调用接口,例如int 80h只有在运行32位任务时才有可能。 显然,你可以简单地将源代码组装成ELF32,但是如果以64位模式运行任务(即额外的寄存器和64位操作),则会失去所有优势。

为了在64位任务中进行系统调用,必须使用“新”系统调用接口。 系统调用本身是通过syscall指令完成的。 内核破坏寄存器rcxr11 。 系统的编号在寄存器rax指定,而调用的参数以rdirsirdxr10r8r9传递。 请记住,系统调用的数量与32位模式下的不同。 您可以在unistd_64.h找到它们,通常位于/usr/include/asm或分发存储位置。

链接地址: http://www.djcxy.com/p/85913.html

上一篇: 64 having trouble writing command line arguments, returning

下一篇: sse4.S results in Segmentation Fault