考慮下面的宏:奇怪的宏(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的初學者調試幫助問題實際上都有一個調試器屏幕截圖或包含調試他們遇到問題所需的所有信息的東西。所以人們經常會發布代碼,只是詢問爲什麼會發生段錯誤,甚至沒有說出哪些指令錯誤。 –