Je suis un peu nouveau au langage d'assemblage et je voulais comprendre comment cela fonctionne sur un système plus ancien. Je comprends que le grand modèle de mémoire utilise des pointeurs éloignés tandis que le petit modèle de mémoire utilise des pointeurs proches, et que l'adresse de retour dans le grand modèle est 4 octets au lieu de deux, le premier paramètre passe de [bp+4]
à [bp+6]
. Cependant, dans le processus d'adaptation d'une bibliothèque graphique d'un petit à un grand modèle, il y a d'autres choses subtiles que je ne semble pas comprendre. L'exécution de ce code avec un grand modèle de mémoire de C est censé effacer l'écran, mais il se bloque le système (il a été assemblé avec TASM):Comment traduire l'assembly DOS ciblé pour le petit modèle de mémoire vers le grand modèle de mémoire?
; void gr256cls(int color , int page);
COLOR equ [bp+6]
GPAGE equ [bp+8]
.MODEL LARGE,C
.186
public C gr256cls
.code
gr256cls PROC
push bp
mov bp,sp
push di
pushf
jmp skip_1
.386
mov ax,0A800h
mov es,ax
mov ax,0E000h
mov fs,ax
CLD
mov al,es:[bp+6]
mov ah,al
mov bx,ax
shl eax,16
mov ax,bx
cmp word ptr GPAGE,0
je short cls0
cmp word ptr GPAGE,2
je short cls0
jmp short skip_0
cls0:
mov bh,0
mov bl,1
call grph_cls256
skip_0:
cmp word ptr GPAGE,1
je short cls1
cmp word ptr GPAGE,2
je short cls1
jmp short skip_1
cls1:
mov bh,8
mov bl,9
call grph_cls256
skip_1:
.186
popf
pop di
pop bp
ret
.386
grph_cls256:
mov fs:[0004h],bh
mov fs:[0006h],bl
mov cx,16384
mov di,0
rep stosd
add word ptr fs:[0004h],2
add word ptr fs:[0006h],2
mov cx,16384
mov di,0
rep stosd
add word ptr fs:[0004h],2
add word ptr fs:[0006h],2
mov cx,16384
mov di,0
rep stosd
add word ptr fs:[0004h],2
add word ptr fs:[0006h],2
mov cx,14848 ;=8192+6656
mov di,0
rep stosd
;; Freezes here.
ret
gr256cls ENDP
end
Il se bloque au ret
à la fin de grph_256cls
. En fait, même si je suis immédiatement ret
depuis le début de la fonction, il reste toujours juste après. Existe-t-il une liste complète des différences lors du codage de l'assemblage dans les deux modes, afin que je puisse comprendre plus facilement ce qui se passe?
EDIT: Pour clarifier, c'est la source d'origine. Cette sortie n'est pas générée. il est destiné à être assemblé et relié dans une bibliothèque.
Notez que dans le modèle de code grand, les appels de fonction poussent une adresse de retour de quatre octets sur la pile. Vous pourriez vouloir considérer cela dans la définition de 'COLOR' et' GPAGE'. – fuz
Les paramètres étaient à l'origine '[bp + 4]' et '[bp + 6]', avec une adresse de retour de deux octets poussée sur la pile, donc j'ai ajouté deux octets à chacun. – nonbirithm
Vous devez montrer le code complet avec toutes les étapes que vous avez prises pour le construire et l'exécuter afin que nous puissions reproduire le problème. Si nécessaire, réduisez le code C qui appelle cette fonction au minimum nécessaire pour reproduire le problème. Faites en sorte que le code de votre message soit exactement le même que celui que vous utilisez. –