Вывод текста на экран - 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
указывает на начало области данных в памяти компьютера.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д