Da esadecimale a decimale

di il
7 risposte

Da esadecimale a decimale

Ciao a tutti sono nuovo sia del forum che come programmatore assembly, dovrei fare un programma che converte un numero esadecimale in decimale, siccome come già detto non ho mai programmato in assembly ho trovato sul web il programma già svolto, mi potreste aiutare a capire come si interpreta, tipo mettendo dei commenti sulle operazioni più importanti? questo è il codice

# Conversione da esadecimale a decimale
# @author xxxx

    .data

# program output text constants
prompt:     .asciiz  "\nInserire un numero esadecimale:  "
result1:    .asciiz  "Il suo decimale equivalente e: "
newline:    .asciiz  "\n"
myString:
    .space 64

    .text

#MIPS Variables for hexVal
# 


# main program
#
# program variables
#   num:   $s0

main:

while:
    li      $v0, 4          # issue prompt
    la      $a0, prompt
    syscall

    li      $v0, 8
    la      $a0, myString
    li      $a1, 64
    syscall

	la $s0, myString #$s0 = char *ptr = myString;
	lbu $s1, ($s0)  #$s1 = myString[0];
	beq $s1, 10, endw

	move $a0, $s0
	jal readHex

	beq $v1,0,notAHexValue #test result
	move $s0, $v0
	
    li      $v0, 4          # print "Il decimale equivalente è"
    la      $a0, result1
    syscall

    li      $v0, 1          #print result
    move    $a0, $s0
    syscall

notAHexValue:
	b while
endw: 

    li      $v0, 10         # terminate the program
    syscall


readHex:
	move $t8, $ra
	li $t3, 0
    li $t4, 0
    li $t5, 1
	li $t7, 16
hexWhile:
	lbu $t6, ($a0)
    beq $t6,10,hexEndWhile
    mul $t3, $t3, $t7
    
    lbu $v0, ($a0)
    jal hexVal

	beq $s1, -1, failed

    add $t3, $t3, $s1
    
	add $a0, $a0, 1 #str++
    b hexWhile
failed:
	li $t5, 0
hexEndWhile:
	move $v0, $t3
    move $v1, $t5
	jr $t8


hexVal:
	bge $v0, 48, greaterEqualThan0 #if ((ch1 >= '0'))
    b elseIfChGreaterEqualA
greaterEqualThan0: 
	ble $v0, 57, lessEqualThan9
	b elseIfChGreaterEqualA
lessEqualThan9: # && (ch <= '9')
	sub $t0, $v0, 48
	b endif	

elseIfChGreaterEqualA: #else if (ch >= 'a')
	bge $v0, 97, greaterEqualThanALower
	b elseIfChGreaterEqualThanAUpper
greaterEqualThanALower: #&& (ch <= 'f')
	ble $v0, 102, lessThanEqualFLower
	b elseIfChGreaterEqualThanAUpper
lessThanEqualFLower:
	sub $t0, $v0, 97
	add $t0, $t0, 10
	b endif

elseIfChGreaterEqualThanAUpper: #else if (ch >= 'A')
	bge $v0, 65, greaterEqualThanAUpper
	b else
greaterEqualThanAUpper: #&& (ch <= 'F')
	ble $v0, 70, lessThanEqualFUpper
	b else
lessThanEqualFUpper:
	sub $t0, $v0, 65
	add $t0, $t0, 10
	b endif
else:
	li $t0, -1
endif:
	move $s1, $t0
	jr $ra

7 Risposte

  • Re: Da esadecimale a decimale

    Ti aiuterei volentieri, pero l'assembly che conosco io è diverso da questo codice. questa è la sintassi ATeT, ke è diversa dalla sintassi Intel usata dall'8086. se vuoi ti posso aiutare a farlo con quel tipodi sintassi.
  • Re: Da esadecimale a decimale

    Per me va benissimo
  • Re: Da esadecimale a decimale

    Ok dammi il tempo di fare il convertitore e poi ti passo il codice
  • Re: Da esadecimale a decimale

    #make_com#
    org 100h


    leggi macro ;macro per leggere una stringa
    mov ah,0ah
    lea dx,vettHex
    int 21h
    endm

    jmp inizio

    ;dichiarazione delle variabili
    msgInsNum db "Inserisci il numero in esadecimale (0 - FF): $"
    msgConvDec db "conversione in decimale: $"
    aCapo db 10,13,"$"
    vettHex db 3,?,3 dup(?)
    vettDec db 4 dup(?)
    fattore db 1
    numDec db ?

    inizio:

    lea dx,msgInsNum ;passo il parametro alla procedura
    call stampa ;chiamo la procedura per stampare

    leggi

    lea dx,aCapo
    call stampa

    sub ch,ch
    mov cl,vettHex[1] ;imposto il contatore del ciclo
    mov si,cx ;imposto l'indice del vettore
    inc si

    cicloConverti:
    mov al,vettHex[si] ;sposta in al il contenuto dell'array "vettHex" alla posizione si
    cmp al,"a" ;confronto al con "a"
    je sostA ;se e' uguale salta all'etichetta "sostA..."
    cmp al,"A"
    je sostA
    cmp al,"b"
    je sostB
    cmp al,"B" ;controlli necessari a verificare
    je sostB ;la presenza di eventuali lettere
    cmp al,"c" ;nella stringa esadecimale
    je sostC
    cmp al,"C"
    je sostC
    cmp al,"d"
    je sostD
    cmp al,"D"
    je sostD
    cmp al,"e"
    je sostE
    cmp al,"E"
    je sostE
    cmp al,"f"
    je sostF
    cmp al,"F"
    je sostF
    jmp continua

    sostA: ;inserisco in al il valore di A esadecimale
    mov al,10 ;perche' quando vado a convertire il numero
    jmp salta ;non viene riconosciuta la lettere, ma il numero

    sostB:
    mov al,11
    jmp salta

    sostC:
    mov al,12
    jmp salta

    sostD:
    mov al,13
    jmp salta

    sostE:
    mov al,14
    jmp salta

    sostF:
    mov al,15
    jmp salta

    continua:
    sub al,"0"

    salta:
    mov bl,fattore
    mul bl
    add numDec,al
    sub ah,ah ;conversione da esa a dec
    mov al,bl ;tramite forma polinomiale
    mov bl,16
    mul bl
    mov fattore,al
    dec si ;decremento l'indice del vett in modo da puntare al prossimo valore
    loop cicloConverti ;istruzione loop serve per ciclare

    sub ch,ch
    mov cl,3
    mov si,2

    cicloEstrai: ;ciclo per estrarre il numero
    sub ah,ah ;appena convertito e porlo in
    mov al,numDec ;un array in modo da poterlo stampare
    mov bl,10
    div bl
    mov numDec,al
    mov vettDec[si],ah
    add vettDec[si],"0"
    dec si
    loop cicloEstrai

    lea dx,msgConvDec
    call stampa

    mov vettDec[3],"$" ;inserisco il dollaro nell'ultima posizione per riconoscere la fine della stringa
    lea dx,vettDec
    call stampa

    ret

    stampa proc ;procedura per stampare una stringa
    mov ah,9h
    int 21h
    ret
    endp
  • Re: Da esadecimale a decimale

    Ecco qui il programma come l'ho fatto io. ti ho messo qualche commento, comunque se vuoi qualche spiegazione chiedi
  • Re: Da esadecimale a decimale

    Grazie mille, ho provato a lanciarlo su qtSpim ma mi da il seguente errore:


    spim: (parser) syntax error on line 5 of file /Users/shine/Desktop/esadecimale.s
    leggi macro ;macro per leggere una stringa
    ^
  • Re: Da esadecimale a decimale

    shine ha scritto:


    grazie mille, ho provato a lanciarlo su qtSpim ma mi da il seguente errore:


    spim: (parser) syntax error on line 5 of file /Users/shine/Desktop/esadecimale.s
    leggi macro ;macro per leggere una stringa
    ^
    si perchè qtSpim riconosce la sintassi AT&T dell'assembly, ossia la sintassi che avevi scritto prima tu, mentre invece io te l'ho scritto con la sintassi Intel dell'8086. io utilizzo l'assemblatore "emu8086"
Devi accedere o registrarti per scrivere nel forum
7 risposte