Linux 使用装配中的移位进行乘法。但是得到的数字太高了!我哪里做错了?
我在使用移位乘以用户给出的两个数字时遇到问题。 它要求用户输入两个整数,并将它们相乘。 我的程序在求整数方面做得很好,但当它给出乘积时,它是一个天文数字,几乎不正确。 我哪里做错了?它在读什么语域 循环:Linux 使用装配中的移位进行乘法。但是得到的数字太高了!我哪里做错了?,linux,assembly,ubuntu,multiplication,shift,Linux,Assembly,Ubuntu,Multiplication,Shift,我在使用移位乘以用户给出的两个数字时遇到问题。 它要求用户输入两个整数,并将它们相乘。 我的程序在求整数方面做得很好,但当它给出乘积时,它是一个天文数字,几乎不正确。 我哪里做错了?它在读什么语域 循环: shl eax,1 dump_regs 1 mov-eax,message3;打印产品 调用打印字符串 mov-ebx,eax 调用print_int 除了询问数字,你几乎在所有事情上都出错了 第一次调用读取的整数时,您的行为就像read\u int将其写入input1,第二次写入int
shl eax,1
dump_regs 1
mov-eax,message3;打印产品
调用打印字符串
mov-ebx,eax
调用print_int
除了询问数字,你几乎在所有事情上都出错了
- 第一次调用读取的整数时,您的行为就像
将其写入read\u int
,第二次写入input1
。这几乎肯定不是事实intput2
- 即使是这样,您也会将第一个数字加载到eax中,然后立即用
的地址覆盖它message2
- 即使输入值正确地加载了eax和ebx,您本应将二者相乘的代码实际上也在按照“如果第二个数字不为零,则将eax乘以2。否则,请别管它。”
- 即使环排列正确,它也会将eax乘以2,再乘以ebx的幂
- 然后,您将使用
的地址覆盖此结果,因此这一切都无关紧要message3
- 最后,无法确定从该代码打印的寄存器是什么。在这个问题和之间,您似乎希望打印eax、ebx或ecx中的任何一个
- 第一次调用读取的整数时,您的行为就像
将其写入read\u int
,第二次写入input1
。这几乎肯定不是事实intput2
- 即使是这样,您也会将第一个数字加载到eax中,然后立即用
的地址覆盖它message2
- 即使输入值正确地加载了eax和ebx,您本应将二者相乘的代码实际上也在按照“如果第二个数字不为零,则将eax乘以2。否则,请别管它。”
- 即使环排列正确,它也会将eax乘以2,再乘以ebx的幂
- 然后,您将使用
的地址覆盖此结果,因此这一切都无关紧要message3
- 最后,无法确定从该代码打印的寄存器是什么。在这个问题和之间,您似乎希望打印eax、ebx或ecx中的任何一个
忽略您发布的代码,严格研究如何乘法(不使用乘法指令),您可以执行以下操作:
请将代码的格式设置得更清晰一点。乍一看,我没有看到任何看起来像乘法的东西(有一个1的移位,不是在循环中),我甚至没有看到除了测试
ebx
是否为零之外,您实际上对输入值进行操作的任何地方。您的代码没有多大意义,而且似乎没有包含任何类似于乘法例程的内容。可能是剪切/粘贴时出错了吗?对齐不一致,垂直间距过大,并且不知道包含的文件做什么,打印和读取功能是如何实现的。请将代码的格式设置得更清晰一些。乍一看,我没有看到任何看起来像乘法的东西(有一个1的移位,不是在循环中),我甚至没有看到除了测试ebx
是否为零之外,您实际上对输入值进行操作的任何地方。您的代码没有多大意义,而且似乎没有包含任何类似于乘法例程的内容。可能是剪切/粘贴时出错了吗?对齐不一致,垂直间距过大,并且不知道包含的文件做什么,打印和读取功能是如何实现的。
%include "asm_io.inc"
segment .data
message1 db "Enter a number: ", 0
message2 db "Enter another number: ", 0
message3 db "The product of these two numbers is: ", 0
segment .bss
input1 resd 1
input2 resd 1
segment .text
Global main
main:
enter 0,0
pusha
mov eax, message1 ; print out first message
call print_string
call read_int ; input first number
mov eax, [input1]
mov eax, message2 ; print out second message
call print_string
call read_int ; input second number
mov ebx, [input2]
cmp eax, 0 ; compares eax to zero
cmp ebx, 0 ; compares ebx to zero
jnz LOOP ;
mult proc
; multiplies eax by ebx and places result in edx:ecx
xor ecx, ecx
xor edx, edx
mul1:
test ebx, 1
jz mul2
add ecx, eax
adc edx, 0
mul2:
shr ebx, 1
shl eax, 1
test ebx, ebx
jnz mul1
done:
ret
mult endp