Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 汇编-寄存器EAX和操作数_Assembly_X86 64 - Fatal编程技术网

Assembly 汇编-寄存器EAX和操作数

Assembly 汇编-寄存器EAX和操作数,assembly,x86-64,Assembly,X86 64,我试着在汇编中编写一个程序来计算操作数a+操作数b 我的大问题是,如果操作数A和操作数B可以用16字节(4个d字)表示。所以我写了这段代码: mov eax, operanda mov ebx, operandb add eax, ebx 但我知道我的操作数大于32位 我遗漏了什么?您需要使用多个寄存器,x64至少需要2个寄存器。您的程序集表明您使用的是32位程序集,因此您需要使用4个寄存器,这使得它更加复杂 有一个C++类,你只需要仿真这个方法,但是看到它在32位场景中会变得复杂,你可能想用

我试着在汇编中编写一个程序来计算操作数a+操作数b

我的大问题是,如果操作数A和操作数B可以用16字节(4个d字)表示。所以我写了这段代码:

mov eax, operanda
mov ebx, operandb
add eax, ebx
但我知道我的操作数大于32位


我遗漏了什么?

您需要使用多个寄存器,x64至少需要2个寄存器。您的程序集表明您使用的是32位程序集,因此您需要使用4个寄存器,这使得它更加复杂


有一个C++类,你只需要仿真这个方法,但是看到它在32位场景中会变得复杂,你可能想用它来编译它,然后将它拆解。如果您真正使用的是x64,则将非常有用。

有一个进位标志用于进行大于dword大小的添加。只需使用
add
添加两个最不重要的DWORD即可。如果加法不适合dword,这将设置进位标志。然后,使用
adc
添加下两个DWORD。这将两个操作数DWORD加上进位标志。继续使用adc添加DWORD,直到达到两个最重要的DWORD。

为结果定义另一个变量
operanc

然后从最不重要的DWORD到最重要的DWORD进行长加法,不要忘记中间进位:

mov eax, dword ptr [operanda]
add eax, dword ptr [operandb]
mov dword ptr [operandc], eax

mov eax, dword ptr [operanda+4]
adc eax, dword ptr [operandb+4]
mov dword ptr [operandc+4], eax

mov eax, dword ptr [operanda+8]
adc eax, dword ptr [operandb+8]
mov dword ptr [operandc+8], eax

mov eax, dword ptr [operanda+12]
adc eax, dword ptr [operandb+12]
mov dword ptr [operandc+12], eax

16字节操作数(128位)在基本算术指令中并不常见。x86处理器只支持16字节宽的逻辑操作(AND、OR、XOR、NAND),您需要使用SSE。谢谢,我写道:mov eax,dword[edx]add eax,[ebx]mov dword[buf32],eax mov eax,dword[edx+4]adc eax,dword[ebx+4]mov dword[buf32+4],eax mov eax,dword[edx+8]adc eax,dword[ebx+8]mov dword[buf32+8],eax mov eax,dword[edx+12]adc eax,dword[ebx+12]mov dword[buf32+12],eax,其中buf32在.bss中定义。ebx&ebx包含我的号码。这是一个错误。原因可能是什么?@AdamSh:edx和ebx必须包含您要添加的数字的地址,而不是数字本身。谢谢,我写道:mov-eax,dword[edx]add-eax,[ebx]mov-dword[buf32],eax-mov-eax,dword[edx+4]adc-eax,dword[ebx+4]mov-dword[buf32+4],eax,eax,dword[edx+8]adc-eax,dword[buf32+8],eax mov eax,dword[edx+12]adc eax,dword[ebx+12]mov dword[buf32+12],eax,其中buf32在.bss中定义。ebx&ebx包含我的号码。这是一个错误。原因可能是什么?