关于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语言中一直是将数据申明放在最前面的呀,难道汇编可以反其道而行之?
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前面
放在标号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
不知你给的程序是否有漏掉的语句?
例:
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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28