2017-06-01 3 views
1

Dans l'article Say Hello to Assembly - Part 3 l'auteur veut imprimer une chaîne (nombre entier converti) sur la pile. r12 contient le nombre de chiffres de la chaîne.La multiplication de l'assemblage multiplie-t-elle?

;;; Find length of string 
mov rax, 1      
mul r12 
mov r12, 8     ; 8 times num digits to get len in bytes 
mul r12 
mov rdx, rax     ; length of string int rdx 


;;;; print sum 
mov rax, SYS_WRITE 
mov rdi, STD_OUT 
mov rsi, rsp 
syscall 

Ma question est peut-on simplifions à:

;;; Find length of string 
mov rax, 8     ; 8 times num digits 
mul r12 
mov rdx, rax     ; length of string int rdx 

Ou est-il quelque chose de subtil sur la méthode de l'auteur que je suis absent?

Pour moi, on dirait qu'il met 1 à rax en multipliant par r12 puis en mettant 8 dans r12 puis en multipliant à nouveau. Ma méthode semble plus propre et semble fonctionner.

+0

Notez que RDX doit être la longueur de la chaîne en rsi pour l'appel SYS_WRITE. – MERM

Répondre

0

Je pense que votre code est équivalent, mais pourquoi pas seulement

imul rdx,r12,8 

ou bien (mais peut-être un plus gras opcode)

lea rdx,[r12*8] 
+0

Les deux instructions ont une longueur de quatre octets. – fuz

+0

Je vois le 'imul rdx, r12,8' comme quatre octets, mais le' lea rdx, [r12 * 8] 'semble être 8 octets car il n'y a pas de registre de base. Si c'était quelque chose comme 'lea rdx, [rax + r12 * 8]' le lea serait de 4 octets. –

+2

Oh ouais, j'ai complètement oublié. Et 'imul' est assez rapide aussi sur les plates-formes modernes, peut-être aussi rapide qu'un' lea' avec un opérande de sib. – fuz