2017-01-19 1 views
1

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.

+0

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

+0

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

+0

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. –

Répondre

1

j'ai changé grph_256cls à une procédure avec PROC FAR et il fonctionne maintenant sans problème:

grph_cls256 PROC FAR 
    ... 
grph_cls256 ENDP 

La question avait à voir avec la façon dont C attend les fonctions à appeler en fonction du modèle de mémoire. Dans le modèle de grande mémoire, tous les appels de fonction sont far. Je n'avais pas étiqueté cette hypothèse sur le sous-programme grph_256cls lorsque j'essayais de le call, donc le code qui n'a pas poussé/déplacé les bonnes valeurs sur/hors de la pile a été assemblé à la place.

+0

Cela n'a rien à voir avec ce que C attend parce que ce n'est pas du code C qui appelle 'grph_256cls'. –

+1

@RossRidge: Ah mais c'est le cas. TASM s'ajuste automatiquement pour ce que C attend. – Joshua

+0

@Joshua Non, ce n'est pas le cas. C'est le problème, si c'était le cas, il le ferait de façon constante. –