я начинающий антимозг, помогите разобраться с выводом на экран
привожу листинг из книги юрова
тут рез-т сохраняется в регистр dl
задача: вывести на экран
;————Prg_6_1.asm—————————————————
;Программа преобразования двузначного шестнадцатеричного числа
;в символьном виде в двоичное представление.
;Вход: исходное шестнадцатеричное число из двух цифр,
;вводится с клавиатуры.
;Выход: результат преобразования помещается в регистр dl.
;—————————————————————————————————
data segment para public "data" ;сегмент данных
message db "Введите две шестнадцатеричные цифры,$"
data ends
stk segment stack
db 256 dup ("?") ;сегмент стека
stk ends
code segment para public "code" ;начало сегмента кода
main proc ;начало процедуры main
assume cs:code,ds:data,ss:stk
mov ax,data ;адрес сегмента данных в регистр ax
mov ds,ax ;ax в ds
mov ah,9
mov dx,offset message
int 21h
xor ax,ax ;очистить регистр ax
mov ah,1h ;1h в регистр ah
int 21h ;генерация прерывания с номером 21h
mov dl,al ;содержимое регистра al в регистр dl
sub dl,30h ;вычитание: (dl)=(dl)—30h
cmp dl,9h ;сравнить (dl) с 9h
jle M1 ;перейти на метку M1, если dl<9h или dl=9h
sub dl,7h ;вычитание: (dl)=(dl)—7h
M1: ;определение метки M1
mov cl,4h ;пересылка 4h в регистр cl
shl dl,cl ;сдвиг содержимого dl на 4 разряда влево
int 21h ;вызов прерывания с номером 21h
sub al,30h ;вычитание: (dl)=(dl)—30h
cmp al,9h ;сравнить (al) с 9h 28
jle M2 ;перейти на метку M2, если al<9h или al=9h
sub al,7h ;вычитание: (al)=(al)—7h
M2: ;определение метки M2
add dl,al ;сложение: (dl)=(dl)+(al)
mov ax,4c00h ;пересылка 4c00h в регистр ax
int 21h ;вызов прерывания с номером 21h
main endp ;конец процедуры main
code ends ;конец сегмента кода
end main ;конец программы с точкой входа main
Здравствуйте, AntiMozg, Вы писали:
AM>я начинающий антимозг, помогите разобраться с выводом на экран AM>привожу листинг из книги юрова AM>тут рез-т сохраняется в регистр dl AM>задача: вывести на экран
AM> int 21h ;вызов прерывания с номером 21h
Если вывести пытаетесь под Windows, то у вас ничего не получится. Так можно сделать только в DOS.
Здравствуйте, AntiMozg, Вы писали:
AS>>Если вывести пытаетесь под Windows, то у вас ничего не получится. Так можно сделать только в DOS.
AM>простите, вы исходник смотрели? AM>зачем писать бред?
AS>>>Если вывести пытаетесь под Windows, то у вас ничего не получится. Так можно сделать только в DOS.
мне под DOS и надо
можете дописать вывод на экран?
Здравствуйте, AntiMozg, Вы писали:
AS>>Если вывести пытаетесь под Windows, то у вас ничего не получится. Так можно сделать только в DOS.
AM>простите, вы исходник смотрели? AM>зачем писать бред?
AS>>>Если вывести пытаетесь под Windows, то у вас ничего не получится. Так можно сделать только в DOS.
если не можешь помочь, так и не пиши.
я спросил конкретный вопрос: как вывести на экран результат из регистра dl(см исходник)
Здравствуйте, AntiMozg, Вы писали:
AS>>>>Если вывести пытаетесь под Windows, то у вас ничего не получится. Так можно сделать только в DOS. AM>если не можешь помочь, так и не пиши. AM>я спросил конкретный вопрос: как вывести на экран результат из регистра dl(см исходник)
Я собирался помочь, для этого мне надо было выяснить чего человек хочет.
Ну а при текущем раскладе мне хамство не нравится и наезды на пустом месте.
Здравствуйте, Anatoliy.Sviridenkov, Вы писали:
AS>Здравствуйте, AntiMozg, Вы писали:
AS>>>>>Если вывести пытаетесь под Windows, то у вас ничего не получится. Так можно сделать только в DOS. AM>>если не можешь помочь, так и не пиши. AM>>я спросил конкретный вопрос: как вывести на экран результат из регистра dl(см исходник)
AS> Я собирался помочь, для этого мне надо было выяснить чего человек хочет. AS> Ну а при текущем раскладе мне хамство не нравится и наезды на пустом месте.
прошу прощения если обидел
так можете ли вы помочь мне?
Здравствуйте, AntiMozg, Вы писали:
AM>прошу прощения если обидел AM>так можете ли вы помочь мне?
В классическом виде вывод на экран делается так
MES DB'Некая строка', '$'
...
MOV AH, 09 ; Запрос на вывод на экран
LEA DX, MES ; Загрузка сообщения
INT 21H
Кроме того посмотрите http://support.microsoft.com/kb/314106, возможно у вас просто не настроена среда MS_DOS. Если вы конечно не чистый DOS используете.
А еще хотелось бы узнать, что у вас конкретно не работает.
Программа компилируется?
При выполнении что пишет?
Здравствуйте, Anatoliy.Sviridenkov, Вы писали:
AS>Здравствуйте, AntiMozg, Вы писали:
AM>>прошу прощения если обидел AM>>так можете ли вы помочь мне?
AS> В классическом виде вывод на экран делается так
AS>
AS>MES DB'Некая строка', '$'
AS>...
AS> MOV AH, 09 ; Запрос на вывод на экран
AS> LEA DX, MES ; Загрузка сообщения
AS> INT 21H
AS>
AS>Кроме того посмотрите http://support.microsoft.com/kb/314106, возможно у вас просто не настроена среда MS_DOS. Если вы конечно не чистый DOS используете. AS>А еще хотелось бы узнать, что у вас конкретно не работает. AS>Программа компилируется? AS>При выполнении что пишет?
в классическом то виде я знаю как.
;Программа преобразования двузначного шестнадцатеричного числа
;в символьном виде в двоичное представление.
;Вход: исходное шестнадцатеричное число из двух цифр,
;вводится с клавиатуры.
;Выход: результат преобразования помещается в регистр dl.
мне нужно результат вывести на экран
если юзать mov ah 02h так не катит
Здравствуйте, AntiMozg, Вы писали:
AM>Здравствуйте, Anatoliy.Sviridenkov, Вы писали:
AM>мне нужно результат вывести на экран AM>если юзать mov ah 02h так не катит
Вот так примерно, логика работы:
В DL число целого типа, побитно сдвигается в право.
Если выпавший бит 1 то допишем в результат 1, ну и 0 в противном случае.
Ну а дальше этот результат выводится на экран.
Ввод числа я пропустил.
RES DB 20 DUP(' '), '$'
...
MOV BX, 00
MOV CX, 16 ; Длинна
LOAD:
SHR DL, 1 ; сдвиг на 1
JC M1
MOV RES[BX], '0' ; Загрузка в строку еденицы
JMP NEXT
M1:
MOV RES[BX], '1' ; Загрузка в строку еденицы
NEXT:
INC BX
LOOP LOAD:
; Вывод
MOV AH, 09 ; Запрос на вывод на экран
LEA DX, RES ; Загрузка сообщения
INT 21H
Здравствуйте, AntiMozg, Вы писали:
AM>мне нужно результат вывести на экран
Так а результат в каком формате нужно вывести? В виде двоичного, десятичного, шестнадцатиричного или еще какого-ричного числа, или может символа в какой-нибудь кодировке?
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Здравствуйте, ДимДимыч, Вы писали:
ДД>Здравствуйте, AntiMozg, Вы писали:
AM>>мне нужно результат вывести на экран
ДД>Так а результат в каком формате нужно вывести? В виде двоичного, десятичного, шестнадцатиричного или еще какого-ричного числа, или может символа в какой-нибудь кодировке?
Здравствуйте, Anatoliy.Sviridenkov, Вы писали:
AS>Здравствуйте, AntiMozg, Вы писали:
AM>>прошу прощения если обидел AM>>так можете ли вы помочь мне?
AS> В классическом виде вывод на экран делается так
AS>
AS>MES DB'Некая строка', '$'
AS>...
AS> MOV AH, 09 ; Запрос на вывод на экран
AS> LEA DX, MES ; Загрузка сообщения
AS> INT 21H
AS>
AS>Кроме того посмотрите http://support.microsoft.com/kb/314106, возможно у вас просто не настроена среда MS_DOS. Если вы конечно не чистый DOS используете. AS>А еще хотелось бы узнать, что у вас конкретно не работает. AS>Программа компилируется? AS>При выполнении что пишет?
спасибо за подсказку,
в итоге выводит не все цифры правильно
вот код
;————Prg_6_1.asm—————————————————
;Программа преобразования двузначного шестнадцатеричного числа
;в символьном виде в двоичное представление.
;Вход: исходное шестнадцатеричное число из двух цифр,
;вводится с клавиатуры.
;Выход: результат преобразования помещается в регистр dl.
;—————————————————————————————————
data segment para public "data" ;сегмент данных
message db "Введите две шестнадцатеричные цифры"
RES DB 20 DUP(' '), '$'data ends
stk segment stack
db 256 dup ("?") ;сегмент стека
stk ends
code segment para public "code" ;начало сегмента кода
main proc ;начало процедуры main
assume cs:code,ds:data,ss:stk
mov ax,data ;адрес сегмента данных в регистр ax
mov ds,ax ;ax в ds
mov ah,9
mov dx,offset message
int 21h
xor ax,ax ;очистить регистр ax
mov ah,1h ;1h в регистр ah
int 21h ;генерация прерывания с номером 21h
mov dl,al ;содержимое регистра al в регистр dl
sub dl,30h ;вычитание: (dl)=(dl)—30h
cmp dl,9h ;сравнить (dl) с 9h
jle M1 ;перейти на метку M1, если dl<9h или dl=9h
sub dl,7h ;вычитание: (dl)=(dl)—7h
M1: ;определение метки M1
mov cl,4h ;пересылка 4h в регистр cl
shl dl,cl ;сдвиг содержимого dl на 4 разряда влево
int 21h ;вызов прерывания с номером 21h
sub al,30h ;вычитание: (dl)=(dl)—30h
cmp al,9h ;сравнить (al) с 9h 28
jle M2 ;перейти на метку M2, если al<9h или al=9h
sub al,7h ;вычитание: (al)=(al)—7h
M2: ;определение метки M2
add dl,al ;сложение: (dl)=(dl)+(al)
; Lo1:
MOV BX, 00h
MOV CX, 8h ; Длинна
LOAD:
SHR DL, 1h ; сдвиг на 1
JC M11
MOV RES[BX], '0' ; Загрузка в строку 0
JMP NEXT
M11:
MOV RES[BX], '1' ; Загрузка в строку еденицы
NEXT:
INC BX
LOOP LOAD
; Вывод
MOV AH, 09h ; Запрос на вывод на экран
LEA DX, RES ; Загрузка сообщения
INT 21H
mov ax,4c00h ;пересылка 4c00h в регистр ax
int 21h ;вызов прерывания с номером 21h
main endp ;конец процедуры main
code ends ;конец сегмента кода
end main ;конец программы с точкой входа main
Здравствуйте, Anatoliy.Sviridenkov, Вы писали:
AS>Здравствуйте, AntiMozg, Вы писали:
AM>> mov cl,4h ;пересылка 4h в регистр cl AM>> shl dl,cl ;сдвиг содержимого dl на 4 разряда влево
AS>Вот после этого я бы сделал
AS>
AS> and dl, f0h
AS>
AM>> SHR DL, 1h ; сдвиг на 1
AS>А вот тут возможно требуется
AS>
AS> shl dl, 01h
AS>
AS>Хотя конечно было бы здорово, если бы вы написали, какие цифры не так выводятся.
например 33 58 да вообще многие
выводятся не так, т.к. происходит смещение -> первый символ становится последним а последний первым...
ну в предыдущем я приложил исходник
полностью компилируется
TASM
может exe выложить если нет под рукой компилятора
AS>Хотя конечно было бы здорово, если бы вы написали, какие цифры не так выводятся.
вот я выложил исходник+exe http://ifolder.ru/5790349
Кстати, у всех кого есть профиль на RSDN — в нем есть возможность хостить файлы разумного размера, например исходнички-логи-бинари-картинки на которые потом можно ссылаться из своих сообщений — для лучшей иллюстрации оных — модератор
Здравствуйте, AntiMozg, Вы писали:
AM>выводятся не так, т.к. происходит смещение -> первый символ становится последним а последний первым...
Дык вот в этом месте и двигаются биты в сторону младших (вправо), а не как надо.
SHR DL, 1h ; сдвиг на 1
Ну и кстати, ветвление в этом куске
JC M11
MOV RES[BX], '0' ; Загрузка в строку 0
JMP NEXT
M11:
MOV RES[BX], '1' ; Загрузка в строку еденицы
NEXT:
совсем не обязательно:
MOV RES[BX], '0' ; Загрузка в строку 0
ADC RES[BX], 0 ; добавляем флаг переноса - результат '0' или '1'
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth