当前位置: 首页 > 知识库问答 >
问题:

NASM x86_64在编写命令行参数时遇到问题,在rax中返回-14

寇升
2023-03-14

在与广发银行进行了一步之后,似乎没有任何问题,一切都设置好了:

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

谢谢

编辑:在改变了我的系统调用方式后,如下所示,它可以正常工作。谢谢大家的帮助!

共有1个答案

麹培
2023-03-14

我仍然在运行32位硬件,所以这是一个疯狂的asmed猜测!您可能知道,64位系统调用号完全不同,使用“syscall”而不是int 80h。然而,int 80H和32位系统调用号码仍然可以使用,其中64位寄存器被截短为32位。您的测试表明,这可以用于.data中的地址,但如果使用“stack address”,则返回-14(-efault-bad address)。我唯一能想到的是,如果rcx在堆栈上,将其截断为ecx会导致“坏地址”。我不知道64位代码中的堆栈在哪里。这有道理吗?

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

最好,弗兰克

 类似资料:
  • 我正在尝试在最新的intellij(community edition)中使用Java9: IntelliJ IDEA 2016.3 Build#IC-163.7743.44,2016年11月17日构建jre:1.8.0_112-release-408-b2 x86 jvm:OpenJDK服务器VM由JetBrains S.r.o. 有人知道如何解决这个问题吗?还是我应该等到他们发布另一个版本?

  • Rust教程没有解释如何从命令行获取参数。在所有示例中,< code>fn main()只显示了一个空参数列表。 从 访问命令行参数的正确方法是什么?

  • 问题内容: 这个问题已经在这里有了答案 : mysqli_fetch_assoc()期望参数/调用成员函数bind_param()错误。如何获取并修复实际的mysql错误? (1个答案) 4个月前关闭。 问题出在这里:我今天开始使用mysqli进行交换。没什么大不了的,只需要更改一些声明即可。一切正常,没有错误…除了我根本无法执行任何查询。我已经检查过两次和三次。我什至开始创建一种情况,它应该返回

  • 我最近在VSCODE中调试时遇到了一个很大的问题。我已经试着通过搜索网站和重新安装我的一些扩展来修复它。 它不会在调试控制台中显示结果,而是将以下输出写入终端:

  • 我正在尝试使用ADODB.Command对象执行更新SQL查询。我以前从来没有用过它,所以我可能会犯一些愚蠢的错误,她是我代码的副本: 上的错误触发器显示。不是用于字符串值的正确类型吗? 编辑:在尝试@h2so4的方法(将参数值连接到命令字符串中)后,我得到了另一个错误: 。 不知道它是什么意思,但它在我的执行线上触发:

  • 问题内容: 我正在尝试玩 文件如此[处(1)])和here(2)所述。 (1)一个不好的例子: 第一种方法可行,但我不想依赖某些东西。第二个结果是仅播放了一些前导帧,听起来更像是单击。从ByteArrayInputStream播放时,不会是IO问题。 请与您分享为什么会发生这种情况。TIA。 问题答案: 我不确定为什么您链接的第二种方法会启动另一个线程;我相信音频还是会以自己的方式播放。剪辑播放完