2012-06-01 41 views
0

我有一个简单的16位汇编如下所示:ASM琴弦代码的破坏

push bx 

StrVar db "My string!",0 

push ax 

.. other code.. 

我试图用NASM编译它,但我有一个问题..如果我的字符串尾随零不是16位的倍数(假设包含19个字节零),字符串后面的asm被错误对齐并被搞乱(我把它看成反汇编器)。

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

此外......如何防止这种情况发生?我应该每次每个角色数我的琴弦吗?

回答

3

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

通常情况下,您想要在代码的单独段中定义数据。在MASM语法,你可能会使用类似:

.data 

StrVar db "My String!", 0 

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

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

+0

谢谢,没有注意到。无论如何,它应该工作,如果我控制程序的流程,如果反汇编程序显示垃圾,因为它被我的中间程序字符串弄糊涂了吗? –

+1

是的,如果你确保你的数据永远不会被执行,把它放到代码段中并不一定是个大问题。大多数反汇编代码都会花费很多工作来确定代码是什么以及什么不是代码 - 在给定入口点的情况下,他们通常会跟踪指令以查找诸如“jmp”,“call”和“ret”之类的内容,以帮助确定执行什么和不执行什么(FWIW,至少在我的经验中,IDA Pro在这方面的表现要好于大多数人)。 –

1

这可能是您的反汇编程序混淆,因为您正在混合使用这些指令和数据。

+0

它应该如何工作呢? –

+1

没有限制,字符串必须是16个字节长的倍数,否。至于代码是否可行,现在又是另一回事:) –