Kinunatzs Ar Tonelico Ответов: 2

Может ли кто-нибудь помочь мне с этим ассемблером


Может помочь мне исправить это, я не знаю, как разделить числа, которые я вменял, и выход из него неправильный, но я знаю, что мой код на деление неправильный, но я не знаю, что с ним не так, и выход моего умножения не превышает 9, я хочу ввести двузначные числа, такие как 10 и так далее, но я не знаю, как это сделать.
.model small
.stack 1000
.data

Selection DB 13,10,'1.) Multiplication',10,'2.) Division',10,'3.) Exit',10,10,'Select:$'
First_Number DB 13,10,10,'ENTER FIRST NUMBER:$'
Second_Number DB 13,10,'ENTER SECOND NUMBER: $'

Answer1 DB 13,10,10,'The Product is:$'
Answer2 DB 13,10,10,'The Quotient is:$'

.code
Start:

mov ax, @data
mov ds, ax

mov dx, OFFSET Selection
mov ah, 9
int 21h
mov ah, 1
int 21h

cmp al,'1'
jz Multiplication
cmp al,'2'
jz Division
cmp al,'3'
jz Done

Multiplication:

mov dx, OFFSET First_Number
mov ah, 9
int 21h
mov ah, 01
int 21h
mov bl, al
and bl, 0fh

mov dx,  OFFSET Second_Number
mov ah, 9
int 21h
mov ah, 01
int 21h
mov bh, al
and bh, 0fh

mul bx
mov ah, 0
mov bl, al
aas
or ax, 3030h
mov bx, ax

mov dx, OFFSET Answer1
mov ah, 9
int 21h

mov dl, bh
mov ah, 2
int 21h

mov dl, bl
mov ah, 2
int 21h

Jmp Start
Division:

mov dx, OFFSET First_Number
mov ah, 9
int 21h
mov ah, 01
int 21h
mov bl, al
and bl, 0fh

mov dx,  OFFSET Second_Number
mov ah, 9
int 21h
mov ah, 01
int 21h
mov bh, al
and bh, 0fh

div bx
mov ah, 0
mov bl, al
aas
or ax, 3030h
mov bx, ax
     
mov dx, OFFSET Answer1
mov ah, 9
int 21h

mov dl, bh
mov ah, 2
int 21h

mov dl, bl
mov ah, 2
int 21h

Jmp Start
Done:

mov ah, 4ch
int 21h

END


Что я уже пробовал:

Я почти ничего не менял, только расположение кодов

2 Ответов

Рейтинг:
1

Jochen Arndt

Это было давно, я уже писал программы на ассемблере, используя для DOS прерывания 21н.

Но ваш код выглядит так, как будто он нуждается в большом исправлении.

Следующее относится только к умножению.

Вы читаете два отдельных символа и сохраняете их в BL и BH. Но содержимое регистра BX может быть (и, вероятно, будет) изменено при вызове следующей функции прерывания DOS. Таким образом, вам придется нажимать и открывать регистр BX до и после вызова.

Вы маскируете символы, которые были прочитаны с помощью 0fh. Но это символы ASCII. Если известно, что это цифры, то вместо них нужно вычесть 30h.

Чтобы избежать сохранения регистра BX, вы можете вместо этого сохранить входные данные в памяти. Это также позволило бы использовать несколько цифр позже (например, до тех пор, пока не будет введено return) и реализовать преобразование ASCII в целое число.

Вы используете MUL BX. Это позволит выполнить операцию DX:AX = AX * BX. Но вы загрузили BL и BH с двумя входными значениями. Для правильного расчета вы должны загрузить их в AL и BL и использовать MUL BL.

После умножения вы пытаетесь преобразовать результат с помощью AAS. Это неправильный метод здесь (он настраивается после вычитания). Вам нужно преобразование шестнадцатеричной строки в десятичную. Or-ing с 0x30 будет работать только для одиночных цифр меньше 10.

Напечатанный результат снова неверен, потому что содержимое регистра BX снова уничтожается при печати строки ответа.

Непроверенные исправления (только для результатов <= 9):

Multiplication:

mov dx, OFFSET First_Number
mov ah, 9
int 21h
mov ah, 01
int 21h
mov bl, al
;to number (not checking if a digit here)
sub bl, 30h

;save bx
push bx
mov dx,  OFFSET Second_Number
mov ah, 9
int 21h
mov ah, 01
int 21h
;to number (not checking if a digit here)
sub al, 30h
;restore bx
pop bx

;ax = bl * al
mul bl
;to ASCII (al must be <= 9)
add al,30h

;save result
push ax
mov dx, OFFSET Answer1
mov ah, 9
int 21h
;restore result into dx
pop dx

;print character in dl
mov ah, 2
int 21h

Jmp Start


Kinunatzs Ar Tonelico

кажется, это работает, но выход не превышает 9

Jochen Arndt

Как уже было сказано: То есть по замыслу моего решения, которое основано на вашей реализации.

Вы должны реализовать десятичное преобразование в строку для результатов, превышающих девять. Найдите что-то вроде "ASM integer to string" и/или "asm print integer".

Рейтинг:
1

Patrice T

Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволяет вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения, это невероятный инструмент обучения.

Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


Graeme_Grant

Я не думаю, что в программировании asm есть отладчик...

Patrice T

Я могу гарантировать вам, что он существует, потому что я использовал отладчик asm, когда играл с ассемблером во время DOS.
Если я помню,я использовал CodeView и интегрированный отладчик TurboC.

Graeme_Grant

Ах, так оно и есть ... x64dbg[^] ... Google-Мой друг ;)

Patrice T

:-)

enhzflep

Турбо-отладчик, известный просто как TD, является предпочтительным оружием при написании asm-кода для среды DOS. DOS, не забывайте, была 16-битной средой. Отладчик, который вы нашли, предназначен для работы под windows - не совсем то, что нужно при работе либо на реальном оборудовании под управлением DOS, либо внутри сеанса DOSbox.

Для тех, кто пытается копнуть еще глубже, всегда есть (всегда была) мягкость.

Вы также можете запустить виртуальную машину с помощью виртуальной машины Bochs, установить DOS внутри нее, а затем использовать отладчик Bochs - но это действительно для мазохистов, когда кто-то хочет только отладить программу DOS.

TD еще раз - это оружие выбора. ;)

Graeme_Grant

Это была не рекомендация, а просто подтверждение комментария пполиморфа...

enhzflep

Э-э, ладно. Подтверждение кем-то незнакомым такой вещи комментария, сделанного кем-то, кто когда-то использовал эту вещь. [вставить боковые пути смотрите здесь]

Другие неопытные читатели могли бы разумно предположить, что она имеет отношение к делу, поскольку предполагается, что она будет полезна в усилиях тех, кто пишет asm-код для работы под DOS.

Моя цель состояла в том, чтобы предоставить некоторые полезные подходы к любому из них.

Что касается меня, то любой, кто пытается написать и запустить ASM - код без отладчика, должен быть шлепнут по тыльной стороне ладони.

Graeme_Grant

Согласованный. Отладчики - ваш лучший друг.

Kinunatzs Ar Tonelico

Неужели действительно трудно просто поставить код, чем заставить меня посмотреть и разобраться в себе? Митинг? Я знаю где искать инструкции но дело в том что я ничего не понимаю о чем они говорят

Patrice T

Я не практиковал ассемблер в течение 20 лет.
С помощью отладчика вы будете точно видеть, что делает каждая инструкция на уровне регистра, это обычно помогает выяснить, что не так и почему это неправильно, и вывести исправления.

Kinunatzs Ar Tonelico

Как я уже сказал, Проблема в том, что я не знаю, как это работает с кодами или отладчиком, и мои существующие знания позволяют мне печатать только строковые слова или ascii-искусство, а что касается кодов, то я только копирую их, не зная, как работают коды по отдельности, так что моя отладка бессмысленна, так как я даже не знаю, что я делаю.

Поэтому я публикую свой код и позволяю экспертам или кому-то со знанием дела делать это