Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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 装配中算术方程的组合_Assembly_X86_Division_Multiplication_Subtraction - Fatal编程技术网

Assembly 装配中算术方程的组合

Assembly 装配中算术方程的组合,assembly,x86,division,multiplication,subtraction,Assembly,X86,Division,Multiplication,Subtraction,作为一名初学者,我在尝试使用基本命令(如MOV、ADD和DIV)在汇编Winx64中实现函数时遇到了很多问题。我的目标是在汇编中执行以下等式: Z=(X/7)-(Y/3) 为了将Z等同于一个术语,我修改了公式: Z=(3X-7Y)/21 我现在拥有的代码,在我看来,有很多问题。对我来说,在汇编程序中的同一代码中进行乘法、减法和除法是一件困难的事情,而不是只有两个项可以加、乘、减或除 TITLE DISPLAY .MODEL SMALL .386 .STACK

作为一名初学者,我在尝试使用基本命令(如MOV、ADD和DIV)在汇编Winx64中实现函数时遇到了很多问题。我的目标是在汇编中执行以下等式:

Z=(X/7)-(Y/3)

为了将Z等同于一个术语,我修改了公式:

Z=(3X-7Y)/21

我现在拥有的代码,在我看来,有很多问题。对我来说,在汇编程序中的同一代码中进行乘法、减法和除法是一件困难的事情,而不是只有两个项可以加、乘、减或除

TITLE DISPLAY
      .MODEL SMALL
      .386
      .STACK
      .DATA
X     SBYTE 4, 16, 28, 88, 100, -116, -68, -104, -92, 40, 52, -128, -80, -8, 64, 76, -56, -44, -32, -20
Y     SWORD 32765, -16373, -19651, -22927, 29491, 7, -3271, 26215, 6559, 16387, 13111, 9835,
3283, -6545, -9823, -13099, 22937, 19663, -26201, -29479
Z     DWORD lengthof Y dup (0)

      .CODE
MAIN  PROC FAR
      .STARTUP
      ;Program
      MOV AX, @DATA
      MOV DX, AX
      MOV SI, OFFSET X
      MOV DI, OFFSET Y
      MOV CX, LENGTHOF X 

L1:   MOV AX,0
      MOV BX,0
      MOV AX,[SI]
      MOV BX,3
      MUL BX
      MOV BX,AX
      MOV AX,[DI]
      MOV DX,7
      MUL DX
      SUB BX,AX
      MOV AX,BX
      MOV BX,21
      IDIV BX
      ADD SI,TYPE X
      ADD DI,TYPE Y
      LOOP L1
      .EXIT 
MAIN  ENDP
      END
下面是关于Z的期望值的Excel摘录


对于整数除法(就像您正在做的那样),该转换会更改结果。e、 g.
int(5/7)-int(11/3)=-3
。但是
int((3*5-7*11)/21)
-2
。如果希望获得与原始表达式相同的值,则不能忽略整数除法的0舍入。查看原始表达式(或数组上的循环)的编译器输出,以获取如何实现它的示例。@PeterCordes所以我修改了代码并修复了Excel表,因为数学都搞糟了。我觉得我就要做到了,但我仍然有点不知道如何确认这是正确的,因为当X=4和Y=32765时,Z(十六进制)的值不会出现在寄存器中。哦,如果需要支持大输入,这就是除非使用32位操作数大小,否则此转换不起作用的另一个原因
32765*7
使16位寄存器溢出,您将忽略DX:AX mul结果的上半部分。零或符号扩展到32位,然后
imul eax,edx,7
例如执行
eax=edx*7
。你在.386上,所以你可以用这个。或者先做两个部分,这样可以避免包装。