2017-06-01 40 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