【问题标题】:ASM strings get code corruptedASM 字符串导致代码损坏
【发布时间】:2012-06-01 20:08:43
【问题描述】:

我有一个简单的 16 位程序集,如下所示:

push bx

StrVar db "My string!",0

push ax

.. other code..

我正在尝试使用 NASM 对其进行编译,但我有一个问题.. 如果我的带有尾随零的字符串不是 16 位的倍数(比如说,包括 19 个字节零),则字符串后面的 asm 是对齐不好并搞砸了(我在反汇编程序中看到了它)。

为什么会这样?我注意到操作码并不总是 16 位,那么反汇编程序如何决定操作码应该遵循什么边界?

此外..如何防止这种情况发生?我应该在每次每个字符时计算我的字符串吗?

【问题讨论】:

    标签: assembly x86 nasm opcode


    【解决方案1】:

    您的问题是,就目前而言,您的代码没有多大意义。执行push bx 后,它将获取字符串的前几个字节,并尝试将它们作为指令执行。这通常不会很好地工作。

    通常,您希望在与代码不同的段中定义数据。在 MASM 语法中,您可能会使用如下内容:

    .data
    
    StrVar db "My String!", 0
    
    .code
    ; ...
        push bx
        push ax
        mov si, offset StrVar                        
    ; ...
    

    有次您几乎需要在代码段中定义数据,但是当您这样做时,通常需要使用流控制指令来确保它永远不会被执行(例如,插入的跳转表紧跟在来自函数的ret 之后)。

    【讨论】:

    • 谢谢,没注意到。无论如何,如果我很好地控制程序流程,如果反汇编程序显示垃圾,因为它被我的中间程序字符串混淆了,它是否应该工作?
    • 是的,如果您确保您的数据永远不会被执行,那么将其放入代码段不一定是一个大问题。大多数反汇编程序都会做很多工作来弄清楚什么是代码,什么不是——给定一个入口点,他们通常会跟踪指令以找到诸如jmp、call 和ret 之类的东西,帮助弄清楚什么被执行,什么不被执行(FWIW,至少根据我的经验,IDA Pro 在这方面做得比大多数人都好)。
    【解决方案2】:

    这可能是您的反汇编程序感到困惑,因为您正在像这样混合指令和数据。

    【讨论】:

    • 字符串长度必须是 16 字节的倍数,没有限制。至于代码是否可以工作,现在是另一回事了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 2014-03-18
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多