ASM中字符串常量的编译错误

时间:2015-05-15 10:55:52

标签: assembly cygwin nasm

我正在编写一个程序来获取ASM中某些函数名的哈希值。

获取字符串常量的函数如下:

get_strings:
    call get_curr_addr
    pop esi
    add esi, 9
    jmp str_return  

    db "LoadLibraryA"
    db 0x00

这在字节码(xxd输出)中产生以下字符串常量:

 ...
    00000040: 2424 61c3 e8bc ffff ff5e 83c6 09eb 7d4c  $$a......^....}L
    00000050: 6f61 644c 6962 7261 7279 4100 .... ....  oadLibraryA.

OllyDBG将其解释为:

ASCII "dLibraryA",0

当我将代码更改为以下内容时:

get_strings:
    call get_curr_addr
    pop esi
    add esi, 9
    jmp str_return  

    db "Jibberish"
    db 0x00 
    db "LoadLibraryA"
    db 0x00

汇编是“正确的”(我希望它的方式)。

xxd输出:

...
00000050: 0000 4a69 6262 6572 6973 6800 4c6f 6164  ..Jibberish.Load
00000060: 4c69 6272 6172 7941 00.. .... .... ....  LibraryA.

在LoadLibraryA字符串文字前面不再有

7d
字节。

当然,调试器现在可以看到字符串应该是

ASCII "Jibberish",0
ASCII "LoadLibraryA",0

这是cygwin NASM编译器,它表现得很奇怪,还是我慢慢疯了?

1 个答案:

答案 0 :(得分:0)

Lurker和Michael在评论中指出:

除了我的调试器试图解释" Loa"之外,没有问题。 " LoadLibraryA"的一部分因为我把字符串文字放在.text(代码)部分。

在第二个例子中,这不会重现为" Jib"在" Jibberish"字符串,不能翻译成指令。

通过将文字放在.data部分(属于的位置)来解决问题。

在代码中,代码段为:

get_strings:
    call get_curr_addr
    pop esi
    add esi, 9
    jmp str_return  

    db "LoadLibraryA"
    db 0x00

现在变为:

get_strings:
    call get_curr_addr
    pop esi
    add esi, 9
    jmp str_return

[SECTION .data]
    db "LoadLibraryA"
    db 0x00