сумма квадратов первых 5 чисел с использованием программирования DEBUG — Assembly в DOSBOX

#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
  

Это будет вычислено (в общем 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