Вывод текста на экран - Assembler (223255)
Формулировка задачи:
написал программу для нахождения площади треугольника через высоту и основание. сделал ввод с клавы значений и вывод ответа на экран, но проблема с выводом текста и точки
выводит кучу мусора + просто один
а вот что если убрать весь текст. выведет 17 и 1
LOCALS
.model small
.stack 100h
.data
a dw 0
h dw 0
Sz dw 0
So dw 0
Show_S db "Your S = $"
Show_dot db ".$"
.code
main:
call input
mov a, ax
call input
mov h, ax
mov bx, a
imul bx
mov bx, 2
idiv bx
mov Sz, ax
mov So, dx
mov ah, 9h
mov dx, offset Show_S
int 21h
mov ax, Sz
call Show
mov ah, 9h
mov dx, offset Show_dot
int 21h
mov ax, So
call Show
mov ax, 4C00h
int 21h
;output func
Show proc
push ax
push bx
push cx
push dx
push di
mov cx, 10
xor di, di ; di - кол. цифр в числе
; если число в ax отрицательное, то
;1) напечатать '-'
;2) сделать ax положительным
or ax, ax
jns @@Conv
push ax
mov dx, '-'
mov ah, 2 ; ah - функция вывода символа на экран
int 21h
pop ax
neg ax
@@Conv:
xor dx, dx
div cx ; dl = num mod 10
add dl, '0' ; перевод в символьный формат
inc di
push dx ; складываем в стэк
or ax, ax
jnz @@Conv
; выводим из стэка на экран
@@Show:
pop dx ; dl = очередной символ
mov ah, 2 ; ah - функция вывода символа на экран
int 21h
dec di ; повторяем пока di<>0
jnz @@Show
pop di
pop dx
pop cx
pop bx
pop ax
ret
Show endp
;input func
input proc near
push cx
push dx
push bx
push si
; В SI будет признак знака, в BX - число, CX тоже пригодится.
xor si, si
xor bx, bx
xor cx, cx
; Введём первый символ.
mov ah, 01h
int 21h
; Здесь и только здесь может попасться минус. Если это не так,
; перейдём к обычной обработке символа.
cmp al, '-'
jne short @ii1
; Иначе установим признак знака и
inc si
; введём следующий символ.
@ii0: mov ah, 01h
int 21h
; Если символ за '9', то ввод некорректный, прекратим этот беспредел.
@ii1: cmp al, 39h
ja short @ii2
; Переводим символ в число. Если при этом получится нечто отрицательное,
; то исходный символ перед '0', значит, ввод можно прерывать.
sub al, 30h
jb short @ii2
; Итак, в AL цифра, которую нужно приписать справа к уже имеющемуся
; в BX числу. Поместим цифру из AL в CX. Именно для этого он обнулялся.
mov cl, al
; Умножим текущий результат на 10.
shl bx, 1 ; BX = 2 * bx
mov ax, bx ; AX = 2 * bx
shl ax, 2 ; AX = 8 * bx
add bx, ax ; BX = 10 * bx
add bx, cx ; BX = 10 * bx + al
; И так, пока вводят цифры.
jmp short @ii0
; Когда ввели нецифру, посмотрим, надо ли менять знак,
@ii2: test si, si
jz short @ii3
neg bx
; перейдём на новую строку
@ii3: mov ah, 02h
mov dl, 0Dh
int 21h
mov dl, 0Ah
int 21h
; и запишем результат в AX.
mov ax, bx
pop si
pop bx
pop dx
pop cx
ret
input endp
end mainРешение задачи: «Вывод текста на экран»
textual
Листинг программы
mov ax,@data mov ds,ax
Объяснение кода листинга программы
- Переменная
axиспользуется как регистр для хранения данных и команд. - Значение переменной
axкопируется в регистрds. - Переменная
dsиспользуется как регистр для хранения данных и команд. - Значение переменной
dsиспользуется для определения сегмента данных. - Переменная
@dataуказывает на начало области данных в памяти компьютера.