2017-06-01 55 views
1

在文章Say Hello to Assembly - Part 3中,作者想要在堆棧上打印一個字符串(轉換後的整數)。 r12包含字符串中的數字個數。裝配乘法簡化?

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

我的問題是,我們可以簡化爲:

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

或者是有什麼微妙的關於作者的方法,我很想念?

對我來說,他看起來像他正在把rax乘以r12然後把r12然後再乘以8。我的方法似乎更清潔,似乎工作。

+0

注意,RDX必須在RSI的字符串的長度SYS_WRITE調用。 – MERM

回答

0

我覺得你的代碼是等價的,但爲什麼不只是

imul rdx,r12,8 

或替代地(儘管也許胖碼)

lea rdx,[r12*8] 
+0

兩條指令都是四個字節長。 – fuz

+0

我看到'imul rdx,r12,8'爲四個字節,但由於沒有基址寄存器,因此'lea rdx,[r12 * 8]似乎是8個字節。如果它是'lea rdx,[rax + r12 * 8]',那麼lea將是4個字節。 –

+2

哦,是的,我完全忘了。現代平臺上的'imul'速度也非常快,可能與具有sib操作數的'lea'一樣快。 – fuz