+ -
当前位置:首页 → 问答吧 → 关于masm编译问题

关于masm编译问题

时间:2010-11-14

来源:互联网

有如下汇编代码
code segment
assume cs:code,ds:code,es:code
.386p
org 100h
start:
push cs
pop ds
Xpos dw 0a0h;本来必须在数序段里的东西,为什么也可以放在代码段里?
mov ax,13h
mov bx,xpos
mov bx,3fh
code ends
end START

用masm编译后,我们在debug下反汇编,得到的反汇编代码如下
-u100
0B93:0100 0E PUSH CS
0B93:0101 1F POP DS
0B93:0102 A000B8 MOV AL,[B800];与上面的对应,怎么会反汇编出这一句?
0B93:0105 1300 ADC AX,[BX+SI];这一句呢?
0B93:0107 8B1E0201 MOV BX,[0102];这个0102应该是xpos的地址了吧,那为什么调试时发现传递给bx的值不是预想中的a0,而是00?
0B93:010B BB3F00 MOV BX,003F
0B93:010E 28428E SUB [BP+SI-72],AL
0B93:0111 06 PUSH ES
0B93:0112 2A428B SUB AL,[BP+SI-75]
0B93:0115 F7D1 NOT CX
0B93:0117 E603 OUT 03,AL
0B93:0119 F3 REPZ
0B93:011A 26 ES:
0B93:011B 8B04 MOV AX,[SI]
0B93:011D 3B066C3C CMP AX,[3C6C]


请教高手如上问题,这里最大的困惑应是将xpos放在代码段里的后果,另外我看见有些人写汇编代码,他们不建立数据段,而是在代码段的最后申明数据成员,为什么居然可以这样,在c语言中一直是将数据申明放在最前面的呀,难道汇编可以反其道而行之?

作者: p569354158   发布时间: 2010-11-14

瞎猜一下吧, 由于程序里用了伪指令.386P,那么masm则将程序按照32位汇编指令来编译,而debug是16位的调试程序, 故此出现一些莫名其妙的东东。
另外, 在代码段是可以定义一些字符串的,这些字符串的属性是只读的。
个人看法,仅供参考。

作者: masmaster   发布时间: 2010-11-14

楼上不是我要的结果,没这么简单

作者: p569354158   发布时间: 2010-11-14

Xpos dw 0a0h这个是伪指令,只是定义一个字的变量,当然会出现你不认识的代码。你可以把Xpos dw 0a0h
放在标号start前面

作者: leetow2003   发布时间: 2010-11-14

数据不一定非要放在数据段,也可以放在代码段。此时,或让指令不要执行到该单元,或用数据来伪装指令。
例:

code segment
assume cs:code,ds:code
start:
push cs
pop ds
lea dx,text
mov ah,9
db 0cdh,021h ;这句实际上是 int 21h 对应的机器码
mov ah,4ch
int 21h

text db 'Hello!$' ;因为程序到上一句就返回操作系统了,所以这几个字节不会被当成指令执行

code ends
end START

不知你给的程序是否有漏掉的语句?

作者: shzhfu   发布时间: 2010-11-14