flotteur d’impression d’assemblage

J’ai des problèmes avec les actions suivantes en assemblage. Je travaille sur l’assemblage IA32. Supposons -4 (% ebp) = x et -8 (% ebp) = y et je les reçois déjà de l’utilisateur. c’est le code:

format1: .ssortingng "Multiply : %u * %u = %llu\n" format2: .ssortingng "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 

La raison pour laquelle le résultat de la multiplication est en% llu est que je veux pouvoir multiplier 2 nombres longs et imprimer le résultat même s’il atteint 64 octets. De plus, dans% edx, la commande mull enregistre les “autres 32 octets” du résultat sur 64 octets. Je dois donc le placer également dans la stack pour printf. Par exemple, je veux cette sortie:

  Multiply : 4000000000 * 2 = 16000000000 

De plus, je souhaite que l’opération de division de 3 avec 4 renvoie le résultat X.YZ. (pas plus de 2 chiffres dans la mantisse, sans arrondir), par exemple

 Divide : 3 / 4 = 0.75 

pour 19 et 1000:

 Divide : 19 / 1000 = 0.01 

et pour 8 et 2:

 Divide : 8 / 2 = 4.00 

J’ai vraiment essayé beaucoup d’obtenir le résultat, mais sans succès. Merci beaucoup! 🙂

Oui, bien sûr, vous pouvez utiliser scanf , il suffit de passer les arguments corrects. Comme on vous l’a dit, pour obtenir un résultat en virgule flottante, vous devez utiliser une division et un format de virgule flottante pour l’impression.

Notez que, conformément à la convention d’appel, vous devez conserver la valeur du registre ebx . En outre, vous devez garder la stack équilibrée et de préférence alignée.

Une solution possible:

 .comm x,4,4 .comm y,4,4 .section .rodata format1: .ssortingng "Div : %d / %d = %g\n" format2: .ssortingng "Mod : %d %% %d = %d\n" format3: .ssortingng "%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 

Voir le code en vigueur .