昨天我进行了一次有趣的采访,面试官问我一个经典问题:如何在不使用*运算符的情况下将Java中的两个数字相乘.老实说,我不知道这是采访带来的压力,但我无法提出任何解决方案.
面试结束后,我回到家中,通过SO轻松寻找答案.到目前为止,我发现了以下内容:
第一种方法:使用For循环
// Using For loop
public static int multiplierLoop(int a, int b) {
int resultat = 0;
for (int i = 0; i < a; i++) {
resultat += b;
}
return resultat;
}
Run Code Online (Sandbox Code Playgroud)
第二种方法:使用递归
// using Recursion
public static int multiplier(int a, int b) {
if ((a == 0) || (b == 0))
return 0;
else
return (a + multiplier(a, b - 1));
}
Run Code Online (Sandbox Code Playgroud)
第三种方法:使用Log10
**// Using Math.Log10
public static double multiplierLog(int …Run Code Online (Sandbox Code Playgroud) 我认为2的补码的重点是对于有符号和无符号数字的操作可以采用相同的方式.维基百科甚至特别列出了多重作为其中一项有益的操作.那么为什么x86对每个都有单独的指令,mul并且imul?x86-64仍然如此吗?
我正在通过paul caurter从PC Assembly学习80386
mul source
Run Code Online (Sandbox Code Playgroud)
- 如果操作数是字节大小,则将其乘以AL寄存器中的字节,结果存储在AX的16位中.
精细.
- 如果源是16位,则将其乘以AX中的字,32位结果存储在DX:AX中.
Q1:为什么选择DX:AX?为什么它不能存储在EAX/EDX中?
imul 真是令人困惑
imul dest, source1
imul dest, source1, source2
Run Code Online (Sandbox Code Playgroud)
alt text http://img697.imageshack.us/img697/8976/imul.gif
我在理解表格方面遇到了问题.
Q2:在表的第2个条目中.再次,为什么DX:AX.为什么不EAX或EDX?
现在考虑以下代码片段:
imul eax ; edx:eax = eax * eax
mov ebx, eax ; save answer in ebx
mov eax, square_msg ; square_msg db "Square of input is ", 0
call print_string ; prints the string eax
mov eax, ebx
call print_int ; prints the int stored in eax
call …Run Code Online (Sandbox Code Playgroud) 我编译了以下程序:
#include <stdint.h>
uint64_t usquare(uint32_t x) {
return (uint64_t)x * (uint64_t)x;
}
Run Code Online (Sandbox Code Playgroud)
这拆解为:
0: 89 f8 mov eax,edi
2: 48 0f af c0 imul rax,rax
6: c3 ret
Run Code Online (Sandbox Code Playgroud)
但是imul用于乘以有符号数字的指令.那为什么用gcc呢?
/ edit:使用uint64_t程序集时类似:
0: 48 0f af ff imul rdi,rdi
4: 48 89 f8 mov rax,rdi
7: c3 ret
Run Code Online (Sandbox Code Playgroud) C语言有签名和无符号类型,如char和int.我不确定,它是如何在汇编级别实现的,例如在我看来,有符号和无符号的乘法会带来不同的结果,因此汇编执行无符号和有符号算术或仅执行一次,这在某种程度上是模拟的不同的情况?
我在cygwin下的Windows 7机器上以32位模式使用GCC.我有以下功能:
unsigned f1(unsigned x, unsigned y)
{
return x*y;
}
Run Code Online (Sandbox Code Playgroud)
我希望代码执行无符号乘法,因此我希望它生成mul指令,而不是imul指令.我用以下命令编译程序:
gcc -m32 -S t4.c
Run Code Online (Sandbox Code Playgroud)
生成的汇编代码是:
.file "t4.c"
.text
.globl _f1
.def _f1; .scl 2; .type 32; .endef
_f1:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
imull 12(%ebp), %eax
popl %ebp
ret
.ident "GCC: (GNU) 4.8.2"
Run Code Online (Sandbox Code Playgroud)
我相信生成的代码中有错误的乘法指令,但我发现很难相信GCC有这么简单的错误.请评论.