ASM字符串使代码损坏

时间:2012-06-01 20:08:44

标签: assembly x86 nasm opcode

我有一个简单的16位汇编,如下所示:

push bx

StrVar db "My string!",0

push ax

.. other code..

我正在尝试用NASM编译它,但我有一个问题..如果我的字符串尾随零不是16位的倍数(假设,包括19个字节零)字符串后面的asm是坏对齐并搞砸了(我把它看成了反汇编程序)。

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

此外..怎样才能防止这种情况发生?每次每个角色都应该统计我的琴弦吗?

2 个答案:

答案 0 :(得分:3)

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

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

.data

StrVar db "My String!", 0

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

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

答案 1 :(得分:1)

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