Вычисление 3a+4b+5c, деление и получение остатка - Assembler

Узнай цену своей работы

Формулировка задачи:

Помогите, пожалуйста, правильно вывести выражение 3a+4b+5c, затем ((3a+4b+5c)/3)mod45. Возможно есть более простой вариант со стеком, как это сделать, хотелось бы разобраться. В примере некорректно выводится остаток деления на 45. Вот не совсем корректно работающий код:
.model small
       ASSUME CS:kod, DS:dannyje, SS:stek
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
stek segment word stack 'STACK'
       dw 400h dup (00)               ; stek -> 2 Kb
stek ends
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
dannyje segment para public 'DATA'
   
    soobshenije:
       db 'Vvedite chislo'
 
    novajaStroka:   
       db 0Dh, 0Ah, '$'  ; tekst na ekrane
       
    buferVvoda:
       db 6, 00, 10 dup ('*')  
 
    buferOtveta:
    c1  db  00
    c2  db  00      
    c3  db  00
    c4  db  00
    c5  db  00
 
         db  0Dh, 0Ah, '$' 
dannyje ends
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
kod segment para public 'CODE'
    nachalo:
 
       mov ax,     seg dannyje                    ; zapuskajem segment dannyh
       mov ds,     ax
       
       mov ah,     09                             ; nomer funkcii pechati
       mov dx,     offset soobshenije             ; adres vyvodimogo teksta
       int 21h
 
       mov ah,     0Ah                            ; funkcija vvoda
       mov dx,     offset buferVvoda              ; bufer
       int 21h       
 
       mov ah,     09                             ; nomer funkcii pechati
       mov dx,     offset novajaStroka            ;  adres vyvodimogo teksta
       int 21h

       mov word ptr [7 + buferVvoda], 240Ah ; LF + '$' 

       mov dx,     offset buferVvoda + 2
       mov ah,     09
       int 21h

     mov dl, 3  
     
       mov bl,     byte ptr[buferVvoda + 2]  
       sub bl,     '0'
       mov al, bl
       mul dl

       xor dx, dx
       mov dl, al
       xor ax, ax
       mov dh, 4
 
       mov bl,     byte ptr[buferVvoda + 3]   
       sub bl,     '0'
       
       mov al, bl
       mul dh
       add al, dl
 
       xor dx, dx
       mov dl, 5
       mov dh, al

       mov bl,     byte ptr[buferVvoda + 4]   
       sub bl,     '0'
       mov al, bl
       mul dl
       add al, dh
     
       xor cx, cx
       mov cl, al

       mov bl,     byte ptr[buferVvoda + 5]  
       sub bl,     '0'

       mov bl,     byte ptr[buferVvoda + 6]   ; bl <- 5 simvol
       sub bl,     '0'

       mov dx, 0000
       mov bx, word ptr 10
       div bx                             ; dx <- AX mod 10, ax <- AX div 10
 
       add dl, '0'       
       mov byte ptr c5,  dl
       
       mov dx, 0000
       div bx

       add dl, '0'       
       mov byte ptr c4,  dl
       
       mov dx, 0000
       div bx
 
       add dl, '0'       
       mov byte ptr c3,  dl
       
       mov dx, 0000
       div bx

       add dl, '0'       
       mov byte ptr c2,  dl
       
       mov dx,0000
       div bx
 
       add dl, '0'       
       mov byte ptr c1,  dl

       mov dx,0000
       div bx

       mov dx, offset buferOtveta
       mov ah, 09
       int 21h
 
;;;;;;;;;;;;;;;;;;;;;;;;VTOROJ OTVET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

     xor ax, ax 
     xor bx, bx
     xor dx, dx

     mov bx, 3

     mov ax, cx
     div bx

     xor bx, bx

     mov bx, 4
     div bx

     mov ax, dx

     mov dx, 0000
     mov bx, word ptr 10
     div bx                             ; dx <- AX mod 10, ax <- AX div 10

       mov dx, 0000
       mov bx, word ptr 10
       div bx                             
 
       ; Konvertirujem v  ASCII i sohranyajem 5 chislo:     
       add dl, '0'       
       mov byte ptr c5,  dl
       
       ; Snova delim na 10:
       mov dx, 0000
       div bx

       ; Konvertirujem v  ASCII i sohranyajem 4 chislo:   
       add dl, '0'       
       mov byte ptr c4,  dl
       
       ; Snova delim na 10:
       mov dx, 0000
       div bx
       ; Konvertirujem v  ASCII i sohranyajem 3 chislo:     
       add dl, '0'       
       mov byte ptr c3,  dl
       
       ; Snova delim na 10:
       mov dx, 0000
       div bx

       ; Konvertirujem v  ASCII i sohranyajem 2 chislo:    
       add dl, '0'       
       mov byte ptr c2,  dl
       
       ; Snova delim na 10:
       mov dx,     0000
       div bx
 
       ; Konvertirujem v  ASCII i sohranyajem 1 chislo:      
       add dl, '0'       
       mov byte ptr c1,  dl

       ; Snova delim na 10:
       mov dx,     0000
       div bx

       ; Vyvodim otvet:
       mov dx,     offset buferOtveta
       mov ah,     09
       int 21h

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
 
       mov ah,     4ch                            ;nomer funkcii zavershenija
       int 21h
       kod  ends
       end nachalo

Решение задачи: «Вычисление 3a+4b+5c, деление и получение остатка»

textual
Листинг программы
xor dx, dx
;3a
mov ax, a
mov bx, ax
shl ax, 1
add bx, ax
;4b
mov ax, b
shl ax, 2
;3a+4b
add bx, ax
adc dx, 0
;5c
mov ax, c
mov cx, ax
shl ax, 2
add ax, cx
;3a+4b+5c
add ax, bx
adc dx, 0
;===========
;(3a+4b+5c)/3
mov bx, 3
div bx
;===========
;(3a+4b+5c)/3
mov bl, 45
div bl
;вывод

Объяснение кода листинга программы

  1. xor dx, dx — инициализация переменной dx значением 0.
  2. mov ax, a — перемещение значения переменной a в регистр ax.
  3. mov bx, ax — перемещение значения регистра ax в регистр bx.
  4. shl ax, 1 — умножение значения переменной a на 2.
  5. add bx, ax — сложение значений переменных a и b.
  6. mov ax, b — перемещение значения переменной b в регистр ax.
  7. shl ax, 2 — умножение значения переменной b на 4.
  8. add bx, ax — сложение значений переменных a и b.
  9. adc dx, 0 — обновление значения переменной dx с учётом возможной переполнения при сложении.
  10. mov ax, c — перемещение значения переменной c в регистр ax.
  11. mov cx, ax — перемещение значения регистра ax в регистр cx.
  12. shl ax, 2 — умножение значения переменной c на 4.
  13. add ax, cx — сложение значений переменных c и ax.
  14. add ax, bx — сложение значений переменных a и b.
  15. adc dx, 0 — обновление значения переменной dx с учётом возможной переполнения при сложении.
  16. mov bx, 3 — перемещение значения 3 в регистр bx.
  17. div bx — деление значения регистра ax на значение переменной bx с учётом остатка.
  18. mov bl, 45 — перемещение значения 45 в регистр bl.
  19. div bl — деление значения регистра ax на значение переменной bl с учётом остатка.
  20. вывод — вывод значения регистра ax на экран.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.333 из 5