вывод на экран содержимого dl
От: AntiMozg  
Дата: 17.03.08 19:31
Оценка:
я начинающий антимозг, помогите разобраться с выводом на экран
привожу листинг из книги юрова
тут рез-т сохраняется в регистр 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
Re: вывод на экран содержимого dl
От: Anatoliy.Sviridenkov Россия  
Дата: 17.03.08 19:41
Оценка:
Здравствуйте, AntiMozg, Вы писали:

AM>я начинающий антимозг, помогите разобраться с выводом на экран

AM>привожу листинг из книги юрова
AM>тут рез-т сохраняется в регистр dl
AM>задача: вывести на экран

AM> int 21h ;вызов прерывания с номером 21h


Если вывести пытаетесь под Windows, то у вас ничего не получится. Так можно сделать только в DOS.
Re[2]: вывод на экран содержимого dl
От: AntiMozg  
Дата: 17.03.08 20:23
Оценка:
AS>Если вывести пытаетесь под Windows, то у вас ничего не получится. Так можно сделать только в DOS.

простите, вы исходник смотрели?
зачем писать бред?
Re[3]: вывод на экран содержимого dl
От: Anatoliy.Sviridenkov Россия  
Дата: 17.03.08 20:32
Оценка:
Здравствуйте, AntiMozg, Вы писали:

AS>>Если вывести пытаетесь под Windows, то у вас ничего не получится. Так можно сделать только в DOS.


AM>простите, вы исходник смотрели?

AM>зачем писать бред?
Re[4]: вывод на экран содержимого dl
От: AntiMozg  
Дата: 17.03.08 20:40
Оценка:
AS>>>Если вывести пытаетесь под Windows, то у вас ничего не получится. Так можно сделать только в DOS.
мне под DOS и надо
можете дописать вывод на экран?
Re[3]: вывод на экран содержимого dl
От: Anatoliy.Sviridenkov Россия  
Дата: 17.03.08 20:46
Оценка:
Здравствуйте, AntiMozg, Вы писали:

AS>>Если вывести пытаетесь под Windows, то у вас ничего не получится. Так можно сделать только в DOS.


AM>простите, вы исходник смотрели?

AM>зачем писать бред?

Конечно смотрел, и где тут бред?
Re[4]: вывод на экран содержимого dl
От: AntiMozg  
Дата: 18.03.08 11:09
Оценка:
помогите дополнить исходник, для вывода результата на экран.
Re[4]: вывод на экран содержимого dl
От: AntiMozg  
Дата: 18.03.08 13:01
Оценка:
AS>>>Если вывести пытаетесь под Windows, то у вас ничего не получится. Так можно сделать только в DOS.
если не можешь помочь, так и не пиши.
я спросил конкретный вопрос: как вывести на экран результат из регистра dl(см исходник)
Re[5]: вывод на экран содержимого dl
От: Anatoliy.Sviridenkov Россия  
Дата: 18.03.08 13:09
Оценка:
Здравствуйте, AntiMozg, Вы писали:

AS>>>>Если вывести пытаетесь под Windows, то у вас ничего не получится. Так можно сделать только в DOS.

AM>если не можешь помочь, так и не пиши.
AM>я спросил конкретный вопрос: как вывести на экран результат из регистра dl(см исходник)

Я собирался помочь, для этого мне надо было выяснить чего человек хочет.
Ну а при текущем раскладе мне хамство не нравится и наезды на пустом месте.
Re[6]: вывод на экран содержимого dl
От: AntiMozg  
Дата: 18.03.08 13:41
Оценка:
Здравствуйте, Anatoliy.Sviridenkov, Вы писали:

AS>Здравствуйте, AntiMozg, Вы писали:


AS>>>>>Если вывести пытаетесь под Windows, то у вас ничего не получится. Так можно сделать только в DOS.

AM>>если не можешь помочь, так и не пиши.
AM>>я спросил конкретный вопрос: как вывести на экран результат из регистра dl(см исходник)

AS> Я собирался помочь, для этого мне надо было выяснить чего человек хочет.

AS> Ну а при текущем раскладе мне хамство не нравится и наезды на пустом месте.
прошу прощения если обидел
так можете ли вы помочь мне?
Re[7]: вывод на экран содержимого dl
От: Anatoliy.Sviridenkov Россия  
Дата: 18.03.08 14:09
Оценка:
Здравствуйте, AntiMozg, Вы писали:

AM>прошу прощения если обидел

AM>так можете ли вы помочь мне?

В классическом виде вывод на экран делается так

MES   DB   'Некая строка', '$'
...
      MOV  AH, 09   ; Запрос на вывод на экран
      LEA  DX, MES  ; Загрузка сообщения
      INT  21H


Кроме того посмотрите http://support.microsoft.com/kb/314106, возможно у вас просто не настроена среда MS_DOS. Если вы конечно не чистый DOS используете.
А еще хотелось бы узнать, что у вас конкретно не работает.
Программа компилируется?
При выполнении что пишет?
Re[8]: вывод на экран содержимого dl
От: AntiMozg  
Дата: 18.03.08 14:28
Оценка:
Здравствуйте, 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 так не катит
Re[9]: вывод на экран содержимого dl
От: Anatoliy.Sviridenkov Россия  
Дата: 18.03.08 15:10
Оценка: 3 (1) +1
Здравствуйте, 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
Re[9]: вывод на экран содержимого dl
От: ДимДимыч Украина http://klug.org.ua
Дата: 18.03.08 18:46
Оценка:
Здравствуйте, AntiMozg, Вы писали:

AM>мне нужно результат вывести на экран


Так а результат в каком формате нужно вывести? В виде двоичного, десятичного, шестнадцатиричного или еще какого-ричного числа, или может символа в какой-нибудь кодировке?
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[10]: вывод на экран содержимого dl
От: AntiMozg  
Дата: 18.03.08 21:25
Оценка:
Здравствуйте, ДимДимыч, Вы писали:

ДД>Здравствуйте, AntiMozg, Вы писали:


AM>>мне нужно результат вывести на экран


ДД>Так а результат в каком формате нужно вывести? В виде двоичного, десятичного, шестнадцатиричного или еще какого-ричного числа, или может символа в какой-нибудь кодировке?


резултьтат в виде двоичного числа
Re[8]: вывод на экран содержимого dl
От: AntiMozg  
Дата: 18.03.08 22:44
Оценка:
Здравствуйте, 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
Re[9]: вывод на экран содержимого dl
От: Anatoliy.Sviridenkov Россия  
Дата: 18.03.08 23:00
Оценка:
Здравствуйте, AntiMozg, Вы писали:

AM> mov cl,4h ;пересылка 4h в регистр cl

AM> shl dl,cl ;сдвиг содержимого dl на 4 разряда влево

Вот после этого я бы сделал

       and      dl, f0h


AM> SHR DL, 1h ; сдвиг на 1


А вот тут возможно требуется

      shl    dl, 01h


Хотя конечно было бы здорово, если бы вы написали, какие цифры не так выводятся.
Re[10]: вывод на экран содержимого dl
От: AntiMozg  
Дата: 18.03.08 23:22
Оценка:
Здравствуйте, 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 выложить если нет под рукой компилятора
Re[10]: вывод на экран содержимого dl
От: AntiMozg  
Дата: 18.03.08 23:27
Оценка:
AS>Хотя конечно было бы здорово, если бы вы написали, какие цифры не так выводятся.
вот я выложил исходник+exe
http://ifolder.ru/5790349

Кстати, у всех кого есть профиль на RSDN — в нем есть возможность хостить файлы разумного размера, например исходнички-логи-бинари-картинки на которые потом можно ссылаться из своих сообщений — для лучшей иллюстрации оных — модератор
Re[11]: вывод на экран содержимого dl
От: gear nuke  
Дата: 19.03.08 03:59
Оценка:
Здравствуйте, 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
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.