Вывод числа не более FFFF (65535)
Модератор: Andy
Гении АСМы, подскажите, как вывести на экран число из регистра в десятичной форме в заданной позиции экрана MSDOS? Помогите макросом!
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Это не максрос, а целая программа 

Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Есть семпл для анализа? Просто внятного ничего мне найти не удалось по этому поводу. Если это и правда очень сложно, в чем я не сомневаюсь (для меня по крайней мереRomeo писал(а):Это не максрос, а целая программа![]()

Нашел это (процедура печатает дес. число из регистра AX без знака):
Код: Выделить всё
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
tasm x
tlink x
Запустил и получил ошибку:
16-разрядная подсистема MS-DOS
Процессор NTVDM обнаружил недопустимую инструкцию.
CS:0000 IP:0077 OP:f0 37 05 0e 02 Для завершения приложения нажмите "Закрыть"
Моя ось XP.
Данный вопрос собственно не с потолка возник...
Дело было так:
Я сделал лабу по АСМу и весело со спокойной душей пошел в лабу, преподу показывать. Придя в лабу, понял, что моя прога в лабе ведет себя совсем по другому. Там тоже новые машинки P4, как и на компьютере, где было произведено данное творение. Правда, виндовс там 2000, а не XP, как у меня. В итоге запустив свою прогу на экране я увидел 2 зеленых квадрата по центру экрана (т.е. я не видел результата т.е. моих бегущих цифр совсем). Странно подумал я и запустил программу в режиме совместимости с W95. Кое что проявилось (например подписи, а цифры нет)
Ну и ушел я домой расстроенный, уверенный в своей правоте, правда преподу до балды, мол хочу, чтобы работало!
Проверял на др. компах, теже самые 2 квадрата по центру экрана (пустые). А у меня по прежнему на компе работает прога. Я даже изготовил видео доказательство (скачайте, пожалуйста, не пожалеете). В архиве:
1. Видеодоказательство того, что у меня на машине работает
2. Странно ведущий себя exe-ник
3. Соурц
Если помогать не охото, то хоть зацените видюху, кора и изврат страшные! Народ из аськи и мои однокурсники были в шоке, особенно после заявления, что если препод будет буянить, я предьявлю ему видео
http://xos.ru/mifi/xz.rar (163Кб)
В чем дело? Почему где-то работает, а где-то нет? Какие именно настройки?
Дело было так:
Я сделал лабу по АСМу и весело со спокойной душей пошел в лабу, преподу показывать. Придя в лабу, понял, что моя прога в лабе ведет себя совсем по другому. Там тоже новые машинки P4, как и на компьютере, где было произведено данное творение. Правда, виндовс там 2000, а не XP, как у меня. В итоге запустив свою прогу на экране я увидел 2 зеленых квадрата по центру экрана (т.е. я не видел результата т.е. моих бегущих цифр совсем). Странно подумал я и запустил программу в режиме совместимости с W95. Кое что проявилось (например подписи, а цифры нет)
Ну и ушел я домой расстроенный, уверенный в своей правоте, правда преподу до балды, мол хочу, чтобы работало!
Проверял на др. компах, теже самые 2 квадрата по центру экрана (пустые). А у меня по прежнему на компе работает прога. Я даже изготовил видео доказательство (скачайте, пожалуйста, не пожалеете). В архиве:
1. Видеодоказательство того, что у меня на машине работает
2. Странно ведущий себя exe-ник
3. Соурц
Если помогать не охото, то хоть зацените видюху, кора и изврат страшные! Народ из аськи и мои однокурсники были в шоке, особенно после заявления, что если препод будет буянить, я предьявлю ему видео

http://xos.ru/mifi/xz.rar (163Кб)
В чем дело? Почему где-то работает, а где-то нет? Какие именно настройки?
жёстко
я рискнул запустить всё это дело на XP - не работает как ожидаеццо. но с ошибкой не вылетает

- Oscar
- Сообщения: 963
- Зарегистрирован: 29 май 2004, 13:44
- Откуда: Мюнхен (рожден в Киеве)
- Контактная информация:
Если запихнуть процедуру в твою программу, получаем ошибку компилятора:XGarik писал(а):
Скомпилил так:
tasm x
tlink x
Запустил и получил ошибку:
16-разрядная подсистема MS-DOS
Процессор NTVDM обнаружил недопустимую инструкцию.
CS:0000 IP:0077 OP:f0 37 05 0e 02 Для завершения приложения нажмите "Закрыть"
**Error** test.asm(81) CS unreachable from current segment
Точно не помню, но могу предположить, что в модели "small" CS использовать нельзя.
Согласен, завтра исправлюсь выложу обновление видео. Только на этот раз скомпилю прямо этот же файл TASMом! На глазах у всех и запущу его! Правда, смысла врать в такой ситуации я не вижу! К тому же на видео размер exe-шника меньше на поряк (1007 байт), чем в Паскале и др. языках!Oscar писал(а):XGarik,
посмотрел видео.
не вижу прямых доказательств, что запущеный exe-шник - это ассемблер, а не паскаль, например.
- Oscar
- Сообщения: 963
- Зарегистрирован: 29 май 2004, 13:44
- Откуда: Мюнхен (рожден в Киеве)
- Контактная информация:
XGarik,
значит так, по порядку:
1. тот бред, что я написал про CS - я был не прав,
прошу не обращать внимания, сто лет с асмом не возился
2. заголовок темы "Вывод числа не более FFFF (65535)"
немного неправильно отображает суть вопроса.
У тебя числа определены, как байт
(если я не ошибаюсь, это FFh, то есть 255).
3. программа у тебя НЕ ПРАВИЛЬНАЯ,
и какие бы ты доказательства не приводил, это ничего не изменяет.
На твоём компьютере она работает вообще по чистой случайности.
Смотрим сюда:
Можно полюбопытствовать, какую именно функцию BIOSа ты пытаешься вызвать, запихнув в верхнюю часть регистра ax (ah - задаёт ф-цию) половину адреса смещения данных (ds) ?
----------
Проблема вывода числа на ассемблере - не есть тривиальная.
Та процедура, которую ты нашел, это делает таки правильно!
И она будет работать без сбоев, если ты метку входа в программу (begin:) перенесёшь после определения процедуры !!!
Алгоритм её такой:
делим число на основание численной системы (10 в нашем случае)
получаем остаток - последняя цифра числа
превращаем цифру в символ (ASCII character)
/*
кусок ASCII таблицы:
0 - 30h
1 - 31h
2 - 32h
...
9 - 39h
*/
запихиваем символ в стэк
так до тех пор, пока результат целочисленного деления не будет равен нулю (пока не закончатся цифры в числе)
затем выводим цифры (символы из стэка в обратном порядке) на экран
----------
в общем, вот тебе твой макрос:
Ещё я добавил в начале и в конце clrscr для красоты ..
P.S. Виндовз у меня - 2000, так что совместимость с компьютерами в твоём универе должна быть нормальная.
Хоть и не думаю, что в этом может быть проблема.
P.P.S. Удачи тебе в учёбе! :-)
значит так, по порядку:
1. тот бред, что я написал про CS - я был не прав,
прошу не обращать внимания, сто лет с асмом не возился
2. заголовок темы "Вывод числа не более FFFF (65535)"
немного неправильно отображает суть вопроса.
У тебя числа определены, как байт
(если я не ошибаюсь, это FFh, то есть 255).
3. программа у тебя НЕ ПРАВИЛЬНАЯ,
и какие бы ты доказательства не приводил, это ничего не изменяет.
На твоём компьютере она работает вообще по чистой случайности.
Смотрим сюда:
Код: Выделить всё
cprintN macro num
push es
mov ax, ds
mov es, ax
mov al, num
add al, 30h
int 10h
pop es
endm
----------
Проблема вывода числа на ассемблере - не есть тривиальная.
Та процедура, которую ты нашел, это делает таки правильно!
И она будет работать без сбоев, если ты метку входа в программу (begin:) перенесёшь после определения процедуры !!!
Алгоритм её такой:
делим число на основание численной системы (10 в нашем случае)
получаем остаток - последняя цифра числа
превращаем цифру в символ (ASCII character)
/*
кусок ASCII таблицы:
0 - 30h
1 - 31h
2 - 32h
...
9 - 39h
*/
запихиваем символ в стэк
так до тех пор, пока результат целочисленного деления не будет равен нулю (пока не закончатся цифры в числе)
затем выводим цифры (символы из стэка в обратном порядке) на экран
----------
в общем, вот тебе твой макрос:
Код: Выделить всё
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
Ещё я добавил в начале и в конце clrscr для красоты ..
P.S. Виндовз у меня - 2000, так что совместимость с компьютерами в твоём универе должна быть нормальная.
Хоть и не думаю, что в этом может быть проблема.
P.P.S. Удачи тебе в учёбе! :-)
Спасибо огромное и респект Oscar! Таких исчерпывающих знаниями и подробных ответов на форумах мне еще никогда не давали, за все время моего пребывания в интернете! Проверил на своем и другом компьютере, где ранее не работало, все просто идеально работает, как и требуется!
С меня пиво или сок (если не пьешь, как я), что пожелаешь!
Для затравки и коллекции приколов, вот новая видюха с полным процессом компиляции и работающая на моем компьютере!
http://xos.ru/mifi/x.rar (435Кб)
Еще раз спасибо всем тем, кто пробовал у себя этот изврат и рисковал своими машинами ради моего блага :mrgreen: :mrgreen: :mrgreen:
С меня пиво или сок (если не пьешь, как я), что пожелаешь!



Для затравки и коллекции приколов, вот новая видюха с полным процессом компиляции и работающая на моем компьютере!
http://xos.ru/mifi/x.rar (435Кб)
Еще раз спасибо всем тем, кто пробовал у себя этот изврат и рисковал своими машинами ради моего блага :mrgreen: :mrgreen: :mrgreen: