#debugging #assembly #sum #x86-16 #dosbox
#отладка #сборка #сумма #x86-16 #dosbox
Вопрос:
Пожалуйста, помогите, мне нужна сумма квадратов первых 5 чисел с использованием программирования DEBUG — Assembly в DOSBOX. Это пример 2 ^ 2:
-a 100 </i>
15BC:0100 mov ax,1
15BC:0103 mov bx,2 ; Base Number
15BC:0106 mov cx,2 ; Exponent
15BC:0109 ;bucle 109:
15BC:0109 mov dx,0
15BC:010C mul bx
15BC:010E loop 109
15BC:0110 int 20
15BC:0112
-g 110
Комментарии:
1. Ну, как бы вы написали это на языке более высокого уровня? Наверняка вам нужно где-то добавить?
Ответ №1:
Инструкция mul bx
умножает содержимое ax
(всегда) на содержимое bx
регистра (параметра). Поскольку это 16-разрядные регистры, результат может иметь до 32 бит. Младшие 16 бит этого результата помещаются в ax
, а старшие 16 бит в dx
. Таким образом, вам не нужно очищать dx
раньше mul
. Это необходимо только для div
.
Тогда код для вычисления ax = 3²
(в общем ax = bx
cx
виде) будет:
mov ax, 1
mov bx, 3 ; Base Number (that is multiplied by itself cx plus one times)
mov cx, 2 ; Exponent (how often the multiplication should be repeated)
expLoop:
mul bx
loop expLoop
Если вычисляется только квадрат, цикл больше не нужен, и код может быть упрощен:
mov ax, 3 ; Base Number (that is multiplied by itself one time)
mul ax
Это будет вычислено 3²
(в общем ax²
случае). Обратите внимание, что bx
и cx
здесь больше не используются.
Как уже упоминал Майкл, вы должны суммировать свои результаты после этого, если хотите получить сумму квадратов. Причина cx
больше не используется, ее можно использовать с loop
для перебора всех чисел, которые нужно возвести в квадрат. bx
может использоваться для хранения суммы квадратов:
xor bx, bx ; Sum is initialised to zero
mov cx, 5 ; Iterate from 5 down to 1
iterate:
mov ax, cx
mul cx ; Calculate the square of the acutal number
add bx, ax ; Sum up the squares in bx
loop iterate