Вывод числа не более FFFF (65535)
Добавлено: 20 апр 2006, 16:53
Гении АСМы, подскажите, как вывести на экран число из регистра в десятичной форме в заданной позиции экрана MSDOS? Помогите макросом!
Есть семпл для анализа? Просто внятного ничего мне найти не удалось по этому поводу. Если это и правда очень сложно, в чем я не сомневаюсь (для меня по крайней мереRomeo писал(а):Это не максрос, а целая программа![]()
Код: Выделить всё
print10 proc
push ax
push cx
push dx
xor cx,cx
p3:]
Сделал так:
[code] .model small
.stack 100h
.386
.data
stop macro
mov ah,8
int 21h
endm
.code
begin:
print10 proc
push ax
push cx
push dx
xor cx,cx
p3: xor dx,dx
div cs:p
add dx,48
push dx
inc cx
cmp ax,0
jne p3
mov ah,2
p4: pop dx
int 21h
loop p4
pop dx
pop cx
pop ax
ret
p dw 10
print10 endp
mov ax,10
call print10
stop
mov ah,4ch
int 21h
end begin
Если запихнуть процедуру в твою программу, получаем ошибку компилятора:XGarik писал(а):
Скомпилил так:
tasm x
tlink x
Запустил и получил ошибку:
16-разрядная подсистема MS-DOS
Процессор NTVDM обнаружил недопустимую инструкцию.
CS:0000 IP:0077 OP:f0 37 05 0e 02 Для завершения приложения нажмите "Закрыть"
Согласен, завтра исправлюсь выложу обновление видео. Только на этот раз скомпилю прямо этот же файл TASMом! На глазах у всех и запущу его! Правда, смысла врать в такой ситуации я не вижу! К тому же на видео размер exe-шника меньше на поряк (1007 байт), чем в Паскале и др. языках!Oscar писал(а):XGarik,
посмотрел видео.
не вижу прямых доказательств, что запущеный exe-шник - это ассемблер, а не паскаль, например.
Код: Выделить всё
cprintN macro num
push es
mov ax, ds
mov es, ax
mov al, num
add al, 30h
int 10h
pop es
endm
Код: Выделить всё
cprintN macro num
local processdigit, print
push es
xor dh, dh ; clear dh
mov al, num
mov cx, 0
mov bl, 10
processdigit:
div bl ; divide ax=ah:al by value in bl. result in al, remainder in ah
mov dl, al ; save result for compare
mov al, ah ; move remainder digit from ah in al
xor ah, ah ; clear ah
add al, 30h ; convert digit to ASCII digit
push ax ; save ASCII digit
inc cx ; update number of digits to output
cmp dl, 0 ; if not last digit
jne processdigit ; do it again
mov ah, 02h ; init DOS Fn 02H: display output
print:
pop dx ; get ASCII digit
int 21h ; display output
loop print
pop es
endm