C
kommt drauf an, was genau du ausgeben willst, wenn du registerinhalte ausgeben willst, brauchst du zunächst eine funktion, die dessen inhalt in eine geeignete zeichenkette umwandelt, um lesbar zu sein, hier mal eine möglichkeit:
AX2stdout proc near ; gibt ax als 4stelligen hexstring aus
push ax
push dx
push cx
mov cx, ax
shr ax, 12 ; (AH&0xf)>>4
add al, 0 ; clear AF
mov dl, 30h ; = '0'
aaa ; adjust: if ( AL > 9 ) AL = AL + 6 (und AH=1)
add dl, al ; DL='0'...'9', 'A'...'F'
mov ah, 02h
int 21h ; erstes zeichen
mov al, ch
and al, 0fh
add al, 0
mov dl, 30h
aaa
add dl, al
int 21h
mov al, cl
shr al, 4
add al, 0
mov dl, 30h
add dl, al
int 21h
mov al, cl
and al, 0fh
add al, 0
mov dl, 30h
aaa
add dl, al
int 21h
pop cx
pop dx
pop ax
ret
AX2stdout endp
ungetestet, hab ich mir grad aus den fingern gesogen, man kann es sicher besser machen - das ganze einfach mit call AX2stdout aufrufen, damit hast du erstmal eine möglichkeit, überhaupt werte auszugeben - es in dein programm einzubauen überlass ich dir
lea benötigt zwei operanden; eigentlich ist es - bis auf ein paar ausnahmen - kein sonderlich nützlicher befehl. er hat die form
lea reg, [mem]
wobei nicht auf den speicher zugegriffen wird, lediglich die effektive adresse, auf die mem verweist wird berechnet und dann reg zugewiesen. allerdings ist er deutlich langsamer als add oder mov. folglich ist bei statischen variablen ein mov reg, offset var
immer schneller als
lea reg, var
interessanter ist lea daher nur bei komplexer adressierung, aufgrund der beschränkten adressierungsmöglichkeiten im 16bit modus dort allerdings seltener. der wesentliche semantische unterschied zu add ist, das ziel und quelle nicht identisch sein müssen (und man bis zu drei werte - zwei register und eine konstante addieren kann), ausserdem werden keine flags beeinflusst.
im 32bit modus kann man es u.a. zum schnellen multiplizieren mit 3,5 und 9 verwenden.