Вычисление 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 ;вывод
Объяснение кода листинга программы
- xor dx, dx — инициализация переменной dx значением 0.
- mov ax, a — перемещение значения переменной a в регистр ax.
- mov bx, ax — перемещение значения регистра ax в регистр bx.
- shl ax, 1 — умножение значения переменной a на 2.
- add bx, ax — сложение значений переменных a и b.
- mov ax, b — перемещение значения переменной b в регистр ax.
- shl ax, 2 — умножение значения переменной b на 4.
- add bx, ax — сложение значений переменных a и b.
- adc dx, 0 — обновление значения переменной dx с учётом возможной переполнения при сложении.
- mov ax, c — перемещение значения переменной c в регистр ax.
- mov cx, ax — перемещение значения регистра ax в регистр cx.
- shl ax, 2 — умножение значения переменной c на 4.
- add ax, cx — сложение значений переменных c и ax.
- add ax, bx — сложение значений переменных a и b.
- adc dx, 0 — обновление значения переменной dx с учётом возможной переполнения при сложении.
- mov bx, 3 — перемещение значения 3 в регистр bx.
- div bx — деление значения регистра ax на значение переменной bx с учётом остатка.
- mov bl, 45 — перемещение значения 45 в регистр bl.
- div bl — деление значения регистра ax на значение переменной bl с учётом остатка.
- вывод — вывод значения регистра ax на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д