masm汇编看代码提问题 高手快来!

来源:百度知道 编辑:UC知道 时间:2024/09/24 22:20:08
assume cs:code
code segment
dw 0,0,0,0
start:
mov ax,cs
mov ss,ax
mov sp,8
mov ax,1011h
mov ds,ax ;随便获取内存中的一块数据 来进行压栈
mov bx,0
push [bx] ;DS:0000=5657
push [bx+2] ;没有该句时 执行下一句就不弹出 无效指令对话框
mov dx,cs:6 ;dl中的值为57h
mov ah,02h
int 21h
mov ah,07h
int 21h
mov ah,4ch
int 21h
code ends
end start
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
问题1:
debug 中执行mov dx,cs:6这句时遇到无效的指令 CS;0117 IP;ff ff 00 00 98
windows 下 双击运行没弹出什么无效指令对话框 为什么???
但如果少了 push [bx+2] 这一句 就什么问题都没有了

DS:[bx]的值如下
0B8F:0017 FF37 PUSH [BX] DS:0000=5657

问题2:
dl的值是57h
0B8F:001D 8B160600 MOV DX,[0006] CS:0006=5657

调用int 21H 功能2号 应该显示 'W'字符
可在windows下直接双击运行该exe文件 就只显示 空字符
在命令行中启动该exe文件能显示出‘W’字符 这又是为什么???

希望 各位高手 能帮我解释解释 本人才刚入门汇编

问题1:
这个是和DEBUG T命令的陷阱中断与保护模式有关的东西,你可以暂时无视它,等以后学32位保护模式就大概能懂了
简单的说就是在保护模式下,对电脑的控制是分级别的,只有操作系统享有最高的控制权,其他的程序都是在操作系统的监视下运行的,一旦某个程序有"越轨"行为,马上就会被操作系统终止,也就是弹出那个讨厌的对话框
遇到这种情况可以用"G 断点"的方式调试,如果还不行就进入纯DOS模式调试
问题2:
你应该相信电脑,电脑虽然很笨,但它绝对是按规矩办事的
既然显示不了"W",那dl里就肯定不是57H
内存里的数据不是不变的,我用DEBUG调试的时候1011:0000里的字是2020H呢