Domanda:
Cosa sta facendo questa assemblea?
Jez
2019-02-25 23:07:25 UTC
view on stackexchange narkive permalink

Ho provato a capire l'assembly per una parte di un gioco DOS e c'è un'operazione che continua a essere chiamata che utilizza tutti e 4 i registri. Posso vedere cosa fa ogni riga ma non riesco a capire cosa dovrebbe fare tutto il codice insieme.

Qualcuno può darmi un'idea?

Il codice è:

  seg000: 3825 some_math_op_on_regs proc far; CODICE XREF: sub_72C6 + 19FPseg000: 3825; sub_72C6 + 1DDP ... seg000: 3825 cmp cl, 10hseg000: 3828 jnb short loc_383A; Salta se CF = 0seg000: 382A mov bx, dx; il registro c è < 16; spostare d in bseg000: 382C shr ax, cl; Sposta a destra di un valore in c (logico) seg000: 382E sar dx, cl; Sposta d destra del valore in c (aritmetico) seg000: 3830 neg cl; Nega c (complemento a 2) seg000: 3832 add cl, 10h; Aggiungere 16 a cseg000: 3835 shl bx, cl; Shift b a sinistra del valore in c (logico) seg000: 3837 o ax, bx; OPPURE aeb, memorizzare il risultato in aseg000: 3839 retfseg000: 383A; -------------------------------------------------- ------------------ seg000: 383Aseg000: 383A loc_383A:; CODICE XREF: some_math_op_on_regs + 3jseg000: 383A sub cl, 10h; il registro c è > = 16; sottrarre 16 da cseg000: 383D xchg ax, dx; Cambia i valori in a e dseg000: 383E cwd; Converti word in doublewordseg000: 383F sar ax, cl; Sposta a destra di un valore in c (aritmetico) seg000: 3841 retfseg000: 3841 some_math_op_on_regs endp  
Due risposte:
Igor Skochinsky
2019-02-26 02:35:42 UTC
view on stackexchange narkive permalink

Sembra un helper del compilatore shift right a 32 bit. Nell'era dei 16 bit, i numeri a 32 bit erano rappresentati da una coppia di registri, in questo caso ax: dx . Il controllo per 16 è un'ottimizzazione: se lo shift è superiore a 16, il valore del registro basso viene perso completamente, quindi può essere scartato e sostituito da dx>> (shift-16) , mentre il registro alto è riempito con il bit di segno come risultato dell'istruzione cwd . Ecco il codice sorgente (leggermente) commentato dalla libreria di runtime Borland C che sembra corrispondere al tuo:

 ; [] ----------------- ------------------------------------------------ [] ; | H_LRSH.ASM - spostamento lungo a destra |; [] -------------------------------------- --------------------------- [] ;; C / C ++ Run Time Library - Versione 5.0; ; Copyright (c) 1987, 1992 di Borland International; Tutti i diritti riservati.; INCLUDE LE REGOLE.ASI_TEXT segmento pubblico byte 'CODICE' presuppone cs: _TEXT public LXRSH @ public F_LXRSH @ public N_LXRSH @ N_LXRSH @: pop bx; aggiustare per ritorno lontano push cs push bxLXRSH @: F_LXRSH @: cmp cl, 16 jae lsh @ piccolo mov bx, dx; salva le punte alte shr ax, cl; ora sposta ogni metà sar dx, cl ;; Ora abbiamo un buco in AX dove i bit inferiori di; Il DX avrebbe dovuto essere spostato. Quindi dobbiamo prendere il nostro; copia di DX e fai uno spostamento inverso per ottenere il corretto; bit da inserire in AX .; neg cl aggiungi cl, 16 shl bx, cl o ax, bx retflsh @ small: sub cl, 16; per turni superiori a 15, eseguire questa operazione; breve sequenza. xchg ax, dx;
cwd; Ora abbiamo effettuato uno spostamento di 16. sar ax, cl; Ora sposta il resto. retf_TEXT termina end  
Johann Aydinbas
2019-02-26 02:33:47 UTC
view on stackexchange narkive permalink

Sembra essere uno spostamento a destra di 32 bit con il numero di 32 bit fornito in dx: ax e cl è il numero di bit da spostare.

Se presumi che cl sia maggiore di 16, uno spostamento a destra di oltre 16 bit deve occuparsi solo dei 16 bit superiori, che sono memorizzati in dx , perché i 16 bit inferiori vengono comunque spostati.

Quindi questo è esattamente ciò che fa il 2 ° blocco. Se cl è maggiore di 16, sposta dx (16 bit superiore) in ax e convertilo in un numero a 32 bit, sottrai 16 da cl perché questo viene fatto implicitamente ignorando il 16 bit inferiore, quindi sposta la parte superiore (che ora è dx: ax grazie a cwd ) da quel numero.

Non ho cercato di capire la parte superiore, ma la mia ipotesi è che faccia esattamente lo stesso per larghezze di spostamento inferiori a 16 bit.

Fondamentalmente, è a 32 bit spostamento a destra eseguito nell'architettura a 16 bit.



Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 4.0 con cui è distribuito.
Loading...