2017-06-01 6 views
1

In dem Beitrag Say Hello to Assembly - Part 3 der Autor möchte eine Zeichenfolge (konvertierte Ganzzahl) auf dem Stapel drucken. r12 enthält die Anzahl der Ziffern in der Zeichenfolge.Montage mehrfach vereinfacht?

;;; 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 

Meine Frage ist, können wir vereinfachen:

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

Oder gibt es etwas subtiler über die Methode des Autors, dass ich fehle?

Für mich sieht aus wie er setzt 1 in rax Multiplikation mit r12 dann setzen 8 in r12 und dann wieder multiplizieren. Meine Methode scheint sauberer und scheint zu funktionieren.

+0

Beachten Sie, dass rdx die Länge der Zeichenfolge in rsi sein muss der Aufruf SYS_WRITE. – MERM

Antwort

0

Ich denke, Ihr Code entspricht, aber warum nicht nur

imul rdx,r12,8 

oder alternativ (wenn auch vielleicht ein fetter Opcode)

lea rdx,[r12*8] 
+0

Beide Anweisungen sind vier Bytes lang. – fuz

+0

Ich sehe 'imul rdx, r12,8' als vier Bytes, aber 'lea rdx, [r12 * 8]' scheint 8 Bytes zu sein, da es kein Basisregister gibt. Wenn es etwas wie 'lead rdx, [rax + r12 * 8] wäre, wäre die Lease 4 Bytes. –

+2

Oh ja, ich habe es total vergessen. Und "imul" ist auch auf modernen Plattformen ziemlich schnell, vielleicht genauso schnell wie eine 'lea' mit einem sib-Operanden. – fuz