0

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

push bx

StrVar db "My string!",0

push ax

.. other code..

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

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

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

4

2 回答 2

3

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

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

.data

StrVar db "My String!", 0

.code
; ...
    push bx
    push ax
    mov si, offset StrVar                        
; ...

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

于 2012-06-01T20:20:55.257 回答
1

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

于 2012-06-01T20:12:47.300 回答