Ассемблер: задачка

  • Автор темы Trishi
  • Дата начала
T

Trishi

Гость
#1
Тут такое дело. Семестр уже к концу подходит, а ассемблер как был не понятен в начале, так и сейчас смутно с ним.
Вот задачка: "Задать целое число в регистре. Написать программу на ассемблере, которая преобразует данное число в текстовую строку (в десятичной системе) и выведет его на терминал. Число должно быть: целое 1 байт без знака."
Если можно, напишите ее плиз, и с пояснениями, потому что разобраться все-таки хочется.
 
H

Hex_Vulture

Гость
#2
держи:
Код:
;==============================================================
; Вывод целого числа-слова со знаком или без знака
;  Обращение: call procoutnum
;  На входе: ax - выводимое число
;			 dh - число со знаком (1) или без знака (0)
;			 dl - ширина поля вывода (>=0)
;	(если поле больше, чем надо, то слева добавляются пробелы,
;	 если меньше - выводится только число)
;--------------------------------------------------------------
procoutnum proc far
push bp
mov bp,sp
push ax
push dx
push si
sub sp,6		; отвести 6 байтов в стеке под число
; учет знака
cmp dh,1		; вывод со знаком (dh=1)?
jne pon0
cmp ax,0
jge pon0
mov dh,2		; если вывод со знаком и ax<0,
neg ax		 ; то dh:=2, ax:=abs(ax)
pon0: push dx		 ; спасти dh (знак) и dl (ширину)
; запись цифр числа в стек (в обратном порядке)
xor si,si	  ; si - кол-во цифр в числе
pon1: mov dx,0		; ax -> (dx,ax)
div cs:ten	 ; ax=ax div 10; dx=ax mod 10
add dl,'0'
mov [bp-8+si],dl; цифра -> стек
inc si
or  ax,ax
jnz pon1		; еще не 0
; запись минуса, если есть, в стек
pop dx
cmp dh,2
jne pon2
mov byte ptr [bp-8+si],'-'
inc si
; печать пробелов впереди
pon2: mov dh,0		; dx - ширина поля вывода
mov ah,2		; функция 02 прерывания 21h
pon21: cmp dx,si
jle pon3		; ширина <= длина числа
push dx
mov dl,' '
int 21h
pop dx
dec dx
jmp pon21
; печать (минуса и) цифр
pon3: dec si
mov dl,[bp-8+si]
int 21h
or  si,si
jnz pon3
; выход из процедуры
add sp,6
pop si
pop dx
pop ax
pop bp
ret
ten  dw 10
procoutnum endp