考虑下面的宏:奇怪的宏(TASM)
pixelFast MACRO
; This macro draws a pixel, assuming the coordinates are already loaded in cx&dx and the color is in al.
xor bh, bh
mov ah, 0ch
int 10h
ENDM
drawRect MACRO x1, y1, x2, y2, color
LOCAL @@loop, @@row_loop
xor cx, cx
mov dx, y1
mov al, BYTE PTR [color]
@@loop:
mov cx, x1
@@row_loop:
pixelFast
inc cx
cmp cx, x2
jna @@row_loop
inc dx
cmp dx, y2
jna @@loop
ENDM
rendToolBar MACRO
drawRect COLORDISP_X1, COLORDISP_Y1, COLORDISP_X2, COLORDISP_Y2, foreground_color
mov temp_color, 36h
drawRect COLORBTN1_X1, COLORBTN1_Y1, COLORBTN1_X2, COLORBTN1_Y2, temp_color
mov temp_color, 2Eh
drawRect COLORBTN2_X1, COLORBTN2_Y1, COLORBTN2_X2, COLORBTN2_Y2, temp_color
mov temp_color, 4h
drawRect COLORBTN3_X1, COLORBTN3_Y1, COLORBTN3_X2, COLORBTN3_Y2, temp_color
mov temp_color, 2Bh
drawRect COLORBTN4_X1, COLORBTN4_Y1, COLORBTN4_X2, COLORBTN4_Y2, temp_color
ENDM
某处在我的代码,我用的是rendToolBar宏。它应该画一个大的白色画布,然后是一个小广场,并在它旁边放置一些小方格,这与我的问题无关。 请注意,rendToolBar调用drawRect 5次。我在turbo调试器中关注了这段代码(因为出错的地方),并注意到在drawRect宏的第四次执行中,pixelFast的“int 10h”实际上不是“int 10h”,而是“int 2”。这导致了一个NMI,它为我的程序混淆了一些东西。我想知道是什么让TASM在第4次调用宏时以不同的方式扩展宏,尽管这行“int 10h”不依赖于任何宏参数。 如果你看看这个图像,你可以看到那个意外的“int 2”,它应该是一个“int 10”。这之后,你可以看到:
cmp [bx+si], ax
add ch, bh
cmp [bx+03], dx
根据宏的源代码,这3个指令是实际上应该是
inc cx
cmp cx, COLORBTN3_X2
jna @@row_loop
有哪些是有点过中断之前的一些其他指令,但你明白了。
有什么问题吗? – Kamiccolo
@Kamiccolo问题在那里,就在turbo调试器的图片上方。 – Itamar
我希望所有关于SO的初学者调试帮助问题实际上都有一个调试器屏幕截图或包含调试他们遇到问题所需的所有信息的东西。所以人们经常会发布代码,只是询问为什么会发生段错误,甚至没有说出哪些指令错误。 –