注册 登录
编程论坛 汇编论坛

用汇编写的代码OD打开以后多了很多东西,找不到原程序代码

lyl930130 发布于 2015-01-15 09:54, 4822 次点击
源码如下:
程序代码:
DATA SEGMENT
    BUF DB 'HELLO WORLD!  THIS IS MY FIRST ASM FILE! $'
DATA ENDS

 
CODE SEGMENT
    ASSUME  CS:CODE,DS:DATA
START:   MOV AX,DATA
    MOV DS,AX
    LEA DX,BUF
    MOV AH,09
    INT 21H
    MOV AH,4CH
    INT 21H
CODE ENDS
END START


用IDA打开以后还正常,只是数据段和函数名有些东西变了,但是主体的代码段没变
但是用OD打开以后,多了很多函数,而且找不到INT 21h 的中断  
如图,图片依次为OD打开exe以后的起始位置、输出字符串的函数位置、输出字符串函数里的一个循环(该循环能循环很久很久,我调了很久一直在循环中,后来用自动步过,过了好久分钟以上,才停下来输出了字符串;该循环在每次返回上面之前所有寄存器的值都没有变过。)
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录


问题:用OD找不到代码段在哪里,整个里面也没有看到INT XX的中断语句,而是由很多的call。但是自己没有写,不明白为什么

link之后的exe:
只有本站会员才能查看附件,请 登录
8 回复
#2
lyl9301302015-01-15 09:56
表达有误,不是所有寄存器的值没有变,是每次循环以后的值和上一次的值一样
#3
zklhp2015-01-15 12:59
你的程序是16位的 在支持运行16位程序的32位Windows里面 是用一个专门的模块来运行的 也就是你OD标题栏里面的ntvdm 相当于一个虚拟机 而调试虚拟机是比较困难的 你就在做这件困难的事

有两个办法能变简单

1. 不写16位程序 改成32位的 这样OD就能调试了 注意必须是32位的哦 64位的OD也不支持
2. 用16位的调试器 比如Debug调试
#4
lyl9301302015-01-15 14:39
回复 3楼 zklhp
知道了,谢谢。还有一个问题没有解决,就是中断。我怎么也找不着一个中断,是编译器把中断用其他方式表示出来了吗?
#5
zklhp2015-01-15 15:05
以下是引用lyl930130在2015-1-15 14:39:39的发言:

知道了,谢谢。还有一个问题没有解决,就是中断。我怎么也找不着一个中断,是编译器把中断用其他方式表示出来了吗?

你的代码完全在那个虚拟机里运行 而你还没跟踪到执行你的程序的地方

至于中断是怎么实现的 我也不知道
#6
zklhp2015-01-15 15:06
16位已经淘汰了 不值得研究 如果你不是搞安全的 这个16位虚拟机也不值得研究

当然了 你喜欢就好 祝您好运
#7
lyl9301302015-01-15 17:02
回复 6楼 zklhp
谢谢。因为是刚开始接触汇编,从网上下的几十道代码挺适合的,但是没想到是16位的。
#8
wmf20142015-01-15 17:15
使用int应该是在cpu的实模式下完成的,在保护模式下,早期系统会用虚拟dos完成,不知道后来的操作系统能不能虚拟dos模式,好像从win2000后就完全丢弃了吧。int8时钟、int10h显示、int13h硬盘、int16h键盘、int21h dos调用...,这些曾经折磨过早期程序员的中断调用,已经汇入历史长河,渐渐不见踪影了!
#9
lyl9301302015-01-15 21:53
回复 8楼 wmf2014
看来我的教材已经被淘汰很久了。。。。要更新了
1