【问题标题】:UASM with undeclared conversion is not working具有未声明转换的 UASM 不起作用
【发布时间】:2020-06-20 20:50:40
【问题描述】:

在这个汇编程序开发中系统崩溃了。我认为其中一些原型是错误的。但是,我不知道到底是什么问题。

   ;        uasm  -elf64 tagex.asm
    ;        gcc -o out  tagex.o -fno-pie -no-pie `pkg-config --cflags --libs gtk+-3.0`
     
OPTION LITERALS:ON

    gtk_init                    PROTO  :VARARG
    gtk_text_view_new           PROTO  :VARARG
    gtk_text_view_get_buffer    PROTO  :VARARG
    gtk_text_buffer_create_tag  PROTO  :VARARG
.DATA
        WWatch                  qword    0
        WWatchBuffer            qword    0
.CODE
    main PROC
        invoke gtk_init,0,0
        invoke gtk_text_view_new
        mov WWatch              ,rax
        invoke gtk_text_view_get_buffer,WWatch
        mov WWatchBuffer        ,rax
         invoke gtk_text_buffer_create_tag,WWatchBuffer, "rtl_quote",\
                                  "foreground", "green",\
                                  "wrap_mode", 2,\
                                  "direction", 2,\
                                  "indent", 30,\
                                  "left_margin", 20,\
                                  "right_margin", 20,\
                                  0
             invoke gtk_text_buffer_create_tag ,WWatchBuffer,"red_foreground","foreground", "red", 0                                 
        xor rax,rax
        ret
    main ENDP
end 

【问题讨论】:

  • 撞到什么了?使用调试器来查找哪条指令崩溃,这样您就可以将minimal reproducible example 的那部分与代码一起包含在内。我假设这是在某种 GNU/Linux 上?
  • @PeterCordes Ubuntu linux。 [github.com/samsung-191t/coding/blob/master/asm%20error]0x004011f7 sub rsp, 8
  • 第一条指令就崩溃了?这甚至不是内存访问。也许您的指令错误并且您的代码位于不可执行的部分?如果.CODE 是我认为MASM 使用的正确指令,我什至从未听说过UASM 所以IDK。另外,edit您的问题包括您拥有的所有详细信息。
  • 调用第二个函数时出现错误:gtk_text_buffer_create_tag 我尝试了没有这一行的代码:“sub rsp, 8”,我注意到了不同

标签: assembly x86-64 masm


【解决方案1】:

如果调用的函数是非叶函数,则必须在堆栈上创建一个 32 字节的影子空间(sub rsp,32)并在退出代码之前将其恢复(添加 rsp,32)。

前三个调用的函数正常返回,所以它们可能是叶函数。

函数“gtk_text_buffer_create_tag”显然是一个非叶子,所以它写入影子空间(在rsp+8之上,参数所在的地方),所以它覆盖了一些参数。有指向字符串的指针,所以覆盖它们可能是个问题。

通过将 8 加到 rsp 以使函数工作,它必须只写入 rsp+8 空间(在返回地址之上,由 rsp 加 8 创建的空白空间),因此不会覆盖任何参数。如果没有机会调试函数,那将是我最好的猜测。

【讨论】:

  • x86-64 System V ABI 没有影子空间。这只是 Windows x64 调用约定的一部分。但我们可以看到问题是使用uasm -felf64,这大概意味着这将链接到查询者的Ubuntu系统上的本机GNU/Linux可执行文件。
猜你喜欢
  • 2014-10-09
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 2018-07-20
  • 2016-01-19
  • 2021-11-26
相关资源
最近更新 更多