Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.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

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
Linux 使用装配中的移位进行乘法。但是得到的数字太高了!我哪里做错了?_Linux_Assembly_Ubuntu_Multiplication_Shift - Fatal编程技术网

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