我想了解 Turbo Debugger 是如何工作的。所以,例如我有消息,我把它移动到 DX 注册。
(我告诉你它在调试器中的样子):
MOV DX,09E ;This is a version which debugger shows me in debugger mode;
;It takes all information from this code: MOV DX,OFFSET MSG.
事实上,消息的第一个元素地址是在09E(这是调试器理解的方式)。但实际上在调试器屏幕中,我可以看到在DS寄存器中,MSG
地址位于A0。怎么会这样?
我知道代码更合适,但这次屏幕更合适:
如您所见,我标记了2个地址,但它们不一样。实际上我可以看到我的MSG从上面标记的地址(A0
)开始,但调试器将其理解为9E
并将其移至DX
。 有人可以解释一下,怎么可能?
*顺便说一句,程序可以正常运行并打印一切,目的是了解调试器如何理解地址。
MSG
代码很简单:
MSG db 'Hello, how do you do!!!!,'$'
答案 0 :(得分:0)
我相信如果您将单步执行代码,逐条指令,您将看到
DS:00A0
仔细查看位于DS:009E
的内容。
你在那看到什么?两个字节:0A
和0D
这是一个ascii“Line Feed”和一个Ascii“Carriage Return”。
通过了解历史观点可以减少你的困惑......
当打印机使用墨水和纸张,以及电话以1200 BPS的速度传输调制解调器信号时,你支付了一个小时的最低工资,一个小时的连接到一个城市只有三个州,这真的是经济上必须选择将小打印头向左移动,或者只是在打印头停留在相同位置时将压板向下顶起。
我的意思是,你真的在手机账单中看到了它。
不开玩笑,使用0A
字节而不使用0D
字节进行此更改可能意味着您的电话帐单有10或20美元的差异;并且记得当时的通货膨胀因素。
您正确看到消息的原因是因为您的机器首先放置了“换行”(即光标可能会掉到下一行)和“回车”(即光标跳回到在将消息放入屏幕之前的左边缘)。这种情况比您的眼睛看得快得多。
凭借Turbo Debugger的奇迹,您可以单步执行此操作并观察它。
所以,当你在00A0
写下你的消息“开始”时,你是正确的,但是当它告诉你消息在那之前两个字节开始时,Turbo Debugger也是正确的。