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