Что не так с моим алгоритмом при вычислении суммы ряда (сборка x86)? - PullRequest
0 голосов
/ 22 марта 2012

Я сейчас пытаюсь получить сумму ряда по следующей формуле:

((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

Я не уверен, в чем проблема, но, похоже, это происходит, когда умножается -2 и -3.

Кто-то может указать, где я совершаю ошибку?

EDIT
Мне нужно было отредактировать это раньше, так как я имею дело только с числами без знака, мне пришлось изменить свой алгоритм, чтобы проходить через каждое число и добавлять их, а не пытаться использовать формулу. Изначально я хотел использовать формулу, так как считаю, что она будет более эффективной, чем зацикливание.

1 Ответ

4 голосов
/ 22 марта 2012

Я вижу несколько проблем:

  • Если числа подписаны, вы должны использовать IMUL вместо MUL для их умножения.
  • Есличисла подписаны, вы не можете использовать SHR как способ разделить их на степень два.По крайней мере, это должно быть SAR, а не SHR.И даже тогда я бы посоветовал использовать IDIV для получения симметричного усечения.
  • Я точно не знаю, какая часть неправильна, но если ваши входные числа 16-битные, то 8-битные *8-битное = 16-битное умножение неверно, так как вы, вероятно, усекаете входные значения.Аналогично, если входные числа являются 8-разрядными, считывание их как 16-разрядных обычно неверно, так как вы можете наступить на область памяти без памяти и сбоя.

И вы обязательно должны получить Intelили руководство по процессору AMD x86, описывающее, как работают инструкции, и прочитайте об используемых вами инструкциях и посмотрите, откуда они берут свои входные данные, что с ними делают и куда идут выходные данные.

...