Assembly 我的算法在计算级数和(x86汇编)时有什么问题?

Assembly 我的算法在计算级数和(x86汇编)时有什么问题?,assembly,x86,multiplication,series,Assembly,X86,Multiplication,Series,我目前正在尝试使用以下公式计算一系列的总和: ((endNum*(endNum+1)/2)-(startNum*(startNum-1)/2) 第一部分似乎工作正常,但当我进入第二部分时,它给了我一些问题 以下是我正在做的: ; Formula and testing numbers ; ----------------------------- ;((x (x+1) / 2) - ((y (y-1) /2) ; ; - x = 8 ; - y = -2 ; ------------------

我目前正在尝试使用以下公式计算一系列的总和:

((endNum*(endNum+1)/2)-(startNum*(startNum-1)/2)

第一部分似乎工作正常,但当我进入第二部分时,它给了我一些问题

以下是我正在做的:

; Formula and testing numbers
; -----------------------------
;((x (x+1) / 2) - ((y (y-1) /2)
;
; - x = 8
; - y = -2
; -----------------------------


ReadInt WORD[y]        ; read ending integer from user (8)
ReadInt WORD[x]        ; read starting integer from user (-2)

; ((x * (x + 1) / 2)

mov    AX, [x]  
mov    BX, [x]     
add    BX, 1
mul    BL
shr    AX, 1 
mov    [x], AX


; ((y * (y - 1) / 2)

mov    AX, [y]         ; -2
mov    BX, [y]         ; -2
sub    BX, 1           ; -3
mul    BL              ; <-- comes out with 1112 or some odd large number??
shr    AX, 1

sub    [x], AX
;公式和测试编号
; -----------------------------
;((x(x+1)/2)-(y(y-1)/2)
;
;-x=8
;-y=-2
; -----------------------------
读取字[y];从用户处读取结束整数(8)
读取字[x];从用户(-2)读取起始整数
;((x*(x+1)/2)
mov AX,[x]
mov BX[x]
加上BX,1
mul BL
shr AX,1
mov[x],AX
;((y*(y-1)/2)
mov AX,[y];-2
mov BX,[y];-2
子BX,1;-3

mul BL;我看到了一些问题:

  • 如果数字是有符号的,则必须使用
    IMUL
    而不是
    MUL
    进行乘法
  • 如果数字是有符号的,你不能使用
    SHR
    将它们除以二的幂。至少它必须是
    SAR
    ,而不是
    SHR
    。即使如此,我还是建议使用
    IDIV
    来进行对称截断
  • 我不知道哪一部分是错误的,但是如果你的输入数字是16位的,那么做8位*8位=16位乘法是错误的,因为你可能会截断输入值。同样,如果输入数字是8位的,读16位通常是错误的,而且你可能会踩到没有内存的内存位置而崩溃

您必须获得一本英特尔或AMD x86 CPU手册,其中描述了指令的工作原理,并阅读了您正在使用的指令,了解它们从何处获取输入,如何处理它们以及输出到何处。

我看到了一些问题:

  • 如果数字是有符号的,则必须使用
    IMUL
    而不是
    MUL
    进行乘法
  • 如果数字是有符号的,你不能使用
    SHR
    将它们除以二的幂。至少它必须是
    SAR
    ,而不是
    SHR
    。即使如此,我还是建议使用
    IDIV
    来进行对称截断
  • 我不知道哪一部分是错误的,但是如果你的输入数字是16位的,那么做8位*8位=16位乘法是错误的,因为你可能会截断输入值。同样,如果输入数字是8位的,读16位通常是错误的,而且你可能会踩到没有内存的内存位置而崩溃

您必须获得一份英特尔或AMD x86 CPU手册,介绍指令如何工作,并阅读您正在使用的指令,了解它们从何处获取输入,使用它们做什么,以及输出到何处。

您只使用8位寄存器进行乘法,而AH的上8位保持不变。这些最有可能是ll 1是因为之前填充了负数,所以现在你把原来的2s补码变成了无效的数字。顺便说一句,我再强调也不为过了,用调试器看看哪里出了问题。@MarcB谢谢你的回答,我相信你在这里是正确的。你只使用了8位寄存器进行乘法,剩下了u以上8位啊未触及。这些最有可能都是1,因为之前填充了负数,所以现在你将原来的2s补码变成了无效的数字。顺便说一句,我再强调不过了,用调试器看看哪里出了问题。@MarcB谢谢你的回答,我相信你在这里是正确的。如果我同意的话我会不止一次投票给这个答案,我会……非常好的答案。@Alex对不起,我应该提到所有的数字都是无符号的。这意味着我不能使用
SHR
进行除法,而应该使用
SAR
,如果我想这样做的话。我仍然处于组装的学习阶段(显然)谢谢你的建议,我会去一家debugger@Alex我也用我所做的更新了我的帖子。但是在你的帖子和马克的评论之间,我意识到了我的错误。谢谢你们两位指出我的错误。如果我能多次投票给这个答案,我会……非常好的答案。@Alex抱歉,我应该提到所有的数字都是unsigned。这意味着我不能使用
SHR
进行除法,而是应该使用
SAR
,如果我想这样做的话。我仍然处于组装的学习阶段(显然)谢谢你的建议,我会去一家debugger@Alex我也用我所做的更新了我的帖子。但是在你的帖子和马克的评论之间,我意识到了我的错误。谢谢你们两位指出我的错误。