我有一个简单的16位汇编,如下所示:
push bx
StrVar db "My string!",0
push ax
.. other code..
我正在尝试用NASM编译它,但我有一个问题..如果我的字符串尾随零不是16位的倍数(假设,包括19个字节零)字符串后面的asm是坏对齐并搞砸了(我把它看成了反汇编程序)。
为什么会这样?我注意到操作码并不总是16位,所以反汇编程序如何决定操作码应遵循哪些边界?
此外..怎样才能防止这种情况发生?每次每个角色都应该统计我的琴弦吗?
答案 0 :(得分:3)
你的问题是,就目前看来,你的代码没有多大意义。执行push bx
后,它将获取字符串的前几个字节,并尝试将它们作为指令执行。这通常不会很好。
通常,您希望在与代码不同的段中定义数据。在MASM语法中,您可以使用以下内容:
.data
StrVar db "My String!", 0
.code
; ...
push bx
push ax
mov si, offset StrVar
; ...
次你几乎需要在代码段中定义数据,但是当你这样做时,你通常需要使用流控制指令来确保它永远不会被执行(例如,插入一个跳转表)在函数ret
之后立即执行。
答案 1 :(得分:1)
这可能是你的反汇编程序感到困惑,因为你正在混合这样的指令和数据。