Considérez les macros suivantes:macros Bizarre (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
Quelque part dans mon code, j'utilise la macro rendToolBar. Il est censé dessiner une grande toile blanche, puis un petit carré et, à côté, des carrés plus petits dans un certain motif, ce qui n'est pas pertinent pour ma question. Notez que rendToolBar appelle drawRect 5 fois. J'ai suivi ce code dans le débogueur turbo (parce que quelque chose s'est mal passé) et j'ai remarqué que dans la 4ème exécution de la macro drawRect, le "int 10h" de pixelFast n'est pas "int 10h", mais plutôt "int 2". Cela provoque un NMI, qui salit des choses pour mon programme. Je veux savoir ce qui fait que TASM développe différemment la macro pour cette ligne dans le 4ème appel de cette macro, malgré le fait que cette ligne "int 10h" ne repose sur aucun argument de macro. Si vous regardez cette image, vous pouvez voir le "int 2" inattendu là, qui était censé être un "int 10". Après, vous pouvez voir:
cmp [bx+si], ax
add ch, bh
cmp [bx+03], dx
Selon le code source de la macro, ces 3 instructions ont été en fait censés être
inc cx
cmp cx, COLORBTN3_X2
jna @@row_loop
Il y a quelques autres instructions qui sont un peu hors tension avant l'interruption , mais vous avez compris.
et quelle est la question? – Kamiccolo
@Kamiccolo La question est là, juste au-dessus de l'image du débogueur turbo. – Itamar
Je souhaite que toutes les questions debug-help débutant sur SO aient effectivement une capture d'écran du débogueur ou quelque chose contenant toutes les informations nécessaires pour déboguer le problème qu'elles rencontrent. Très souvent, les gens postent du code et demandent simplement pourquoi il se sépare sans même dire quelles fautes d'instructions. –