stampa di assembly float

Sto avendo alcuni problemi con le seguenti azioni in assemblea. Sto lavorando all’assemblaggio IA32. Assumi -4 (% ebp) = x e -8 (% ebp) = y e li ottengo già dall’utente. questo è il codice:

format1: .string "Multiply : %u * %u = %llu\n" format2: .string "Divide : %u / %u = %u\n" # operation multiply movl -4(%ebp), %eax mull -8(%ebp) pushl %edx pushl %eax pushl -8(%ebp) pushl -4(%ebp) pushl $format1 call printf # operation divide movl -4(%ebp), %eax divl -8(%ebp) pushl %eax pushl -8(%ebp) pushl -4(%ebp) pushl $format2 call printf 

Il motivo per cui il risultato della moltiplicazione è in% llu è perché voglio essere in grado di moltiplicare 2 numeri lunghi e stampare il risultato anche se raggiunge 64 byte. E anche che in% edx il comando mull salva gli “altri 32 byte” del risultato a 64 byte, quindi ho bisogno di spingerlo allo stack anche per il printf. ad es. voglio questo risultato:

  Multiply : 4000000000 * 2 = 16000000000 

Inoltre, voglio l’operazione di divisione di 3 con 4 per restituire il risultato X.YZ. (non più di 2 numeri nella mantissa e nessun arrotondamento) ad es

 Divide : 3 / 4 = 0.75 

per 19 e 1000:

 Divide : 19 / 1000 = 0.01 

e per 8 e 2:

 Divide : 8 / 2 = 4.00 

Ho davvero provato molto per ottenere il risultato ma senza successo. molte grazie! 🙂

Sì, certo che puoi usare scanf , basta passare gli argomenti corretti. Come ti è stato detto, per i risultati in virgola mobile è necessario utilizzare alcune divisioni in virgola mobile e un formato in virgola mobile per la stampa.

Si noti che, in base alla convenzione di chiamata, è necessario preservare il valore del registro ebx . Inoltre, dovresti mantenere lo stack bilanciato e preferibilmente allineato.

Una ansible soluzione:

 .comm x,4,4 .comm y,4,4 .section .rodata format1: .string "Div : %d / %d = %g\n" format2: .string "Mod : %d %% %d = %d\n" format3: .string "%d %d" .text .globl main .type main, @function main: subl $32, %esp # allocate space, preserve alignment movl $format3, (%esp) movl $x, 4(%esp) movl $y, 8(%esp) call scanf # operation divide fildl x fidivl y fstpl 12(%esp) # x / y movl $format1, (%esp) movl x, %eax movl %eax, 4(%esp) movl y, %eax movl %eax, 8(%esp) call printf # operation modulo movl x, %eax cltd idivl y movl $format2, (%esp) movl x, %eax movl %eax, 4(%esp) movl y, %eax movl %eax, 8(%esp) movl %edx, 12(%esp) call printf addl $32, %esp xor %eax, %eax ret 

Vedi il codice in funzione .