mercoledì 15 giugno 2011

moltiplicazione e stampa a video registri



# ---------------------------------------
# limitazioni del sottoprogramma output
# al solo registro AL
# esempio di come stampare contenuto di
# un registro a 32 bit
# ---------------------------------------
# usato per verificare la MUL e i suoi
# registri per i risultati
# ---------------------------------------
# nell' esempio:
# %EAX * %EBX = %EDX_%EAX
#
# 0x00BB.00CC * 0xFFCC.AAFF = 0x00BA.DB4C.BF5D.4334
#
# tradotto in naturali:
# 12.255.436 * 4.291.603.199 = 52.595.468.342.739.764
# ---------------------------------------

.GLOBAL _main


.DATA
mess_eax: .ASCII "\nContenuto di EAX: \n\r"
mess_ebx: .ASCII "\nContenuto di EBX: \n\r"
mess_ecx: .ASCII "\nContenuto di ECX: \n\r"
mess_edx: .ASCII "\nContenuto di EDX: \n\r"
mess_esi: .ASCII "\nContenuto di ESI: \n\r"
mess_edi: .ASCII "\nContenuto di EDI: \n\r"
mess_ebp: .ASCII "\nContenuto di EBP: \n\r"
mess_esp: .ASCII "\nContenuto di ESP: \n\r"

alpha: .LONG 0x00aa11ff

.TEXT
_main: NOP
# MOVL alpha,%EBX
# MOV $0,%EBX

# PUSH %EBX
# MOV $mess_ebx,%EBX
# CALL outline
# POP %EBX
# MOV %EBX,%EAX
# CALL print_reg




PUSH %EBX
MOV $mess_eax,%EBX
CALL outline
POP %EBX
MOV $0x00BB00CC,%EAX
CALL print_reg

PUSH %EBX
MOV $mess_ebx,%EBX
CALL outline
POP %EBX
MOV $0xFFCCAAFF,%EBX
PUSH %EAX
MOV %EBX,%EAX
CALL print_reg
POP %EAX

MUL %EBX


PUSH %EBX
MOV $mess_eax,%EBX
CALL outline
POP %EBX
# verifico risultato parte bassa %EAX
CALL print_reg


PUSH %EBX
MOV $mess_edx,%EBX
CALL outline
POP %EBX
# verifico risultato parte alta %EDX
PUSH %EAX
MOV %EDX,%EAX
CALL print_reg
POP %EAX

CALL pause
fine: RET


# ------------------------------
# sottoprogramma di stampa
# ------------------------------

print_reg: PUSH %EAX
SHR $16,%EAX
# 16 bit piu alti del registro
PUSH %EAX
MOV %AH,%AL
CALL outbyte
POP %EAX
CALL outbyte
POP %EAX
# 16 bit piu bassi del registro
PUSH %EAX
MOV %AH,%AL
CALL outbyte
POP %EAX
CALL outbyte
CALL newline
fine_sott: RET



.INCLUDE "C:/GAS/utility"

0 commenti:

Posta un commento