Mov in un registro

di il
8 risposte

Mov in un registro

Sto impazzendo con un emulatore Dos (DosBox) e sto iniziando ad utilizzare l'assembly (GNU gas) insieme a gdb
Dato il seguente codice non capisco come mai:
.GLOBAL _main

.DATA
dato:		.BYTE 9

.TEXT
_main:
	CMPB $9, dato
	JA fine
	CMPB $0, dato
	JE fine
	MOV dato, %EBX
	MOV dato, %EAX
perchè nel registro EAX e EBX vedo il valore 0x109 ?
Mi aspettavo di vedere 9 ?

8 Risposte

  • Re: Mov in un registro

    Usa

    MOVZ

    per azzerare la parte di registro non utilizzato. Stai usando un dato di un byte con registri a 32 bit (4 byte) quindi la parte non utilizzata dei registri deve essere azzerata.
  • Re: Mov in un registro

    oregon ha scritto:


    Usa

    MOVZ

    per azzerare la parte di registro non utilizzato. Stai usando un dato di un byte con registri a 32 bit (4 byte) quindi la parte non utilizzata dei registri deve essere azzerata.
    Lanciando due programmi diversi con le stesse istruzioni vedevo comportamenti diversi, immaginavo quindi fosse un problema di locazione precedentemente occupata.
    Quindi la MOV in pratica prende il byte e lo pone in AL ?
    Ma se invece usassi MOVL cambierebbe qualcosa ?


    Grazie
  • Re: Mov in un registro

    zio_mangrovia ha scritto:


    Quindi la MOV in pratica prende il byte e lo pone in AL ?


    [/quote]
    Ma se invece usassi MOVL cambierebbe qualcosa ?
    [/quote]

    Non puoi utilizzarla con un dato di tipo .BYTE
  • Re: Mov in un registro

    Se volessi invece mettere a zero tutti i bit di EAX "manualmente" ?
    Per semplicità non scriverò tutto il codice.
    dato: .BYTE 9
    MOV dato, %AL
    MOV $0, %AH
    Avrei così impostato il registro AX (parte bassa di EAX) ma come posso mettere a zero la parte alta di EAX ?
  • Re: Mov in un registro

    Ma così avresti 0909 in AX. Non è quello che vuoi.

    Devi azzerare eax e poi caricarlo con il valore

    xor %eax,%eax
    mov dato,%al

    (odio questa sintassi)
  • Re: Mov in un registro

    oregon ha scritto:


    Ma così avresti 0909 in AX. Non è quello che vuoi.
    oops scusami ho corretto, il famoso errore di sbaglio
    Si in effetti dovrei azzerare tutto, credevo ci fosse un analogo di AX per la parte alta di EAX.

    Lo XOR per azzerare il registro è a dir poco favoloso io avrei spontaneamente utilizzato:
    MOVL $0, $EAX
  • Re: Mov in un registro

    In qusto caso la XOR è raccomandata da Intel e AMD per l'efficienza rispetto a qualsiasi altra soluzione e per questo è comunemente usato da tutti i compilatori.

    Ad esempio (non badare alla sintassi, è praticamente equivalente a quella che usi tu), per azzerare con la mov, il codice operativo sarebbe

    B8 00 00 00 00 mov eax,0

    e con la xor

    33 C0 xor eax,eax

    e potrai capire da solo come sono necessari più cicli macchina per il fetch di tutte le parti coinvolte con la mov rispetto alla xor.
    Inoltre la mov accede comunque in memoria, la xor no. Infine, nel caso speciale della xor rax,rax non viene usata alcuna "execution unit".
    Questo permette di fare 4 istruzioni del genere per ciclo di clock.
  • Re: Mov in un registro

    Thanks again
Devi accedere o registrarti per scrivere nel forum
8 risposte