【发布时间】:2016-03-11 17:26:19
【问题描述】:
我有使用循环语法打印 abc 的 ASM 代码。这是我的代码
;abc.com
.model small
.code
org 100h
start:
mov ah, 02h
mov dl, 'a'
mov cx, 3h
ulang:
int 21h
inc dl
loop ulang
int 20h
end start
问题是为什么在INT 21 之后是NOP,而不是INC dl? AFAIK 它应该INC dl 然后LOOP xxxx 三次然后INT 20。
当我连续按-t 时,它会到我不知道的地方,直到崩溃,意味着找不到INT 20h
显示INC dl 和LOOP 0107 表示循环。
仅供参考:
- Win 7 Ultimate SP 1 32 位
- GUI Turbo ASM x86 3.0
- 赛扬双核 n2840
【问题讨论】:
-
int 21h 是一个带有自己代码的中断处理程序。使用
t命令,您进入了 int 21 处理程序代码。您会注意到 CS:IP 从 1400:0107 变为 00A7:107C -
当您到达像
int 21h这样的int时,您可能希望考虑使用pcommand 而不是t。p本身应该执行中断处理程序中的所有代码,然后在inc dl之后的下一条指令上中断 -
@MichaelPetch
p按预期工作,但p和t之间有什么区别?我的意思是继续进行跟踪/步骤之间的区别? -
t将单步(跟踪)进入函数 (call) 和软件中断处理程序 (int) 的代码。p在使用call时不会进入函数或进入int的代码。p将完整地执行一个函数或一个中断处理程序,然后在int或call之后的下一个指令上中断。proceed 更像 STEP OVER,trace 更像 STEP INTO -
FWIW,DOS 调试通过在 CALL/INT 之后放置一个 INT 3 来实现
p。然后它允许程序全速运行。当 INT 3 被击中时,它会移除 INT 3。所以通常情况下,用户看不到 INT 3。然而,在极少数情况下,INT 3 可能会搞砸一些事情。例如,一些汇编例程可以返回到调用后的指令或调用后从+2 开始的指令。如果例程返回 +2,则 INT 3 不会被命中,也不会被调试器删除。更现代的调试器将使用硬件断点而不是 INT3 来避免这种情况。
标签: debugging assembly dos x86-16 tasm