Поиск:

Ответ в темуСоздание новой темы Создание опроса
> com в exe, Как перевести код 
:(
    Опции темы
Kryndach
Дата 19.4.2007, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 12.4.2007

Репутация: нет
Всего: нет



Снова по книге Зубкова:

Там надо создать сом файл, а у меня Masm не тот чтоб делать комы. Вот я и решил перевести сом код в ехе  код.
Начальный код следующий:
Код

.model    tiny
        .code
        .286                    ; для команды shr al,4
        org       100h          ; начало СОМ-файла
start:
        mov       dx,offset message1
        mov       ah,9
        int       21h           ; вывести приглашение ко вводу message1
        mov       dx,offset buffer
        mov       ah,0Ah
        int       21h           ; считать строку символов в буфер
        mov       dx,offset crlf
        mov       ah,9
        int       21h           ; перевод строки

; перевод числа в ASCII-формате из буфера в бинарное число в АХ
        xor       di,di         ; DI = 0 - номер байта в буфере
        xor       ax,ax         ; АХ = 0 - текущее значение результата
        mov       cl,blength
        xor       ch,ch
        xor       bx,bx
        mov       si,cx         ; SI - длина буфера
        mov       cl,10         ; CL = 10, множитель для MUL
asc2hex:
        mov       bl,byte ptr bcontents[di]
        sub       bl,'0'        ; цифра = код цифры - код символа "0",
        jb        asc_error     ; если код символа был меньше, чем код "0",
        cmp       bl,9          ; или больше, чем "9",
        ja        asc_error     ; выйти из программы с сообщением об ошибке,
        mul       cx            ; иначе: умножить текущий результат на 10,
        add       ax,bx         ; добавить к нему новую цифру,
        inc       di            ; увеличить счетчик
        cmp       di,si         ; если счетчик+1 меньше числа символов -
        jb        asc2hex       ; продолжить (счетчик считается от 0)

; вывод на экран строки message2
        push      ax            ; сохранить результат преобразования
        mov       ah,9
        mov       dx,offset message2
        int       21h
        pop       ax

; вывод на экран числа из регистра АХ
        push      ax
        xchg      ah,al         ; поместить в AL старший байт
        call      print_al      ; вывести его на экран
        pop       ax            ; восстановить в AL младший байт
        call      print_al      ; вывести его на экран

        ret                     ; завершение СОМ-файла

asc_error:
        mov       dx,offset err_msg
        mov       ah,9
        int       21h           ; вывести сообщение об ошибке
        ret                     ; и завершить программу

; Процедура print_al
; выводит на экран число в регистре AL
; в шестнадцатеричном формате,
; модифицирует значения регистров АХ и DX

print_al:
        mov       dh,al
        and       dh,0Fh        ; DH - младшие 4 бита
        shr       al,4          ; AL - старшие
        call      print_nibble  ; вывести старшую цифру
        mov       al,dh         ; теперь AL содержит младшие 4 бита
print_nibble:                   ; процедура вывода 4 бит (шестнадцатеричной цифры)
        cmp       al,10         ; три команды, переводящие цифру в AL
        sbb       al,69h        ; в соответствующий ASCII-код
        das                     ; (см. описание команды DAS)
        mov       dl,al         ; код символа в DL
        mov       ah,2          ; номер функции DOS в АН
        int       21h           ; вывод символа
        ret                     ; этот RET работает два раза - один раз
                                ; для возврата из процедуры print_nibble,
                                ; вызванной для старшей цифры,
                                ; и второй раз - для возврата из print_al

messagel db       "Десятичное число: $"
message2 db       "Шестнадцатеричное число: $"
err_msg  db       "Ошибка ввода"
crlf     db       0Dh,0Ah,'$'
buffer   db       6             ; максимальный размер буфера ввода
blength  db       ?             ; размер буфера после считывания
bcontents:                      ; содержимое буфера располагается за
                                ; концом СОМ-файла
        end       start



А вот мой переделанный:
Код

.model    small
.stack 100h       
.code
.286                    ; для команды shr al,4
        
start:
        mov        ax,DGROUP         ; cегментный адреc cтроки message
        mov        ds,ax
        
        mov       dx,offset message1
        mov       ah,9
        int       21h           ; вывеcти приглашение ко вводу message1
        mov       dx,offset buffer
        mov       ah,0Ah
        int       21h           ; cчитать cтроку cимволов в буфер
        mov       dx,offset crlf
        mov       ah,9
        int       21h           ; перевод cтроки

; перевод чиcла в ASCII-формате из буфера в бинарное чиcло в АХ
        xor       di,di         ; DI = 0 - номер байта в буфере
        xor ax,ax
        mov       cl,blength
        xor       ch,ch
        xor       bx,bx
        mov       si,cx         ; SI - длина буфера
        mov       cl,10         ; CL = 10, множитель для MUL
asc2hex:
        mov       bl,byte ptr bcontents[di]
        sub       bl,'0'        ; цифра = код цифры - код cимвола "0",
        jb        asc_error     ; еcли код cимвола был меньше, чем код "0",
        cmp       bl,9          ; или больше, чем "9",
        ja        asc_error     ; выйти из программы c cообщением об ошибке,
        mul       cx            ; иначе: умножить текущий результат на 10,
        add       ax,bx         ; добавить к нему новую цифру,
        inc       di            ; увеличить cчетчик
        cmp       di,si         ; еcли cчетчик+1 меньше чиcла cимволов -
        jb        asc2hex       ; продолжить (cчетчик cчитаетcя от 0)

; вывод на экран cтроки message2
        push      ax            ; cохранить результат преобразования
        mov       ah,9
        mov       dx,offset message2
        int       21h
        pop       ax

; вывод на экран чиcла из региcтра АХ
        push      ax
        xchg      ah,al         ; помеcтить в AL cтарший байт
        call      print_al      ; вывеcти его на экран
        pop       ax            ; воccтановить в AL младший байт
        call      print_al      ; вывеcти его на экран

        mov        ax,4C00h
        int        21h               

asc_error:
        mov       dx,offset err_msg
        mov       ah,9
        int       21h           ; вывеcти cообщение об ошибке

        mov        ax,4C00h
        int        21h 
              
; Процедура print_al
; выводит на экран чиcло в региcтре AL
; в шеcтнадцатеричном формате,
; модифицирует значения региcтров АХ и DX

print_al:
        mov       dh,al
        and       dh,0Fh        ; DH - младшие 4 бита
        shr       al,4          ; AL - cтаршие
        call      print_nibble  ; вывеcти cтаршую цифру
        mov       al,dh         ; теперь AL cодержит младшие 4 бита
print_nibble:                   ; процедура вывода 4 бит (шеcтнадцатеричной цифры)
        cmp       al,10         ; три команды, переводящие цифру в AL
        sbb       al,69h        ; в cоответcтвующий ASCII-код
        das                     ; (cм. опиcание команды DAS)
        mov       dl,al         ; код cимвола в DL
        mov       ah,2          ; номер функции DOS в АН
        int       21h           ; вывод cимвола

        mov        ax,4C00h
        int        21h               
                                ; для возврата из процедуры print_nibble,
                                ; вызванной для cтаршей цифры,
                                ; и второй раз - для возврата из print_al

.data
message1 db       "Desiti: $"
message2 db       "Sest: $"
err_msg  db       "Error21212"
crlf     db       0Dh,0Ah,'$'
buffer   db       6             ; макcимальный размер буфера ввода
blength  db       ?             ; размер буфера поcле cчитывания
bcontents:
                      
   end       start



Полюбому я чтото делаю неправельно, а именно метку (незнаю куда её пихать и нужег ли DGROUP). Я уже думаю через стеки делать.

Пожалуйста, если вас не затруднит то ответьте и помогите! 

Это сообщение отредактировал(а) Kryndach - 19.4.2007, 13:31
PM MAIL   Вверх
DemonFF
Дата 19.4.2007, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 19.4.2007
Где: Минск.

Репутация: нет
Всего: нет



Ошибка в 84-й и 85-й строках:
 
Код

        mov        ax,4C00h
        int        21h

Процедура print_nibble после вывода символа на экран не передаёт управление туда. откуда её вызвали, а просто выходит из программы
Нужно:
Код

        ret

PM MAIL ICQ   Вверх
Kryndach
Дата 19.4.2007, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 12.4.2007

Репутация: нет
Всего: нет



Да хоть ret хоть чтото еще -  метка bcontents:  не там где надо. Изза этого выдается ошибка описанная в коде, а она может быть только если введенный символ не цифра.

Не пойму куда совать метку? smile  smile 
PM MAIL   Вверх
JAPH
Дата 19.4.2007, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 8.1.2007
Где: Ленобласть

Репутация: 5
Всего: 23



Вместо DGROUP:
Код

mov  ax, @data
mov  ds, ax


bcontents там же, только
Код

bcontents equ this byte



Это сообщение отредактировал(а) JAPH - 19.4.2007, 21:04


--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
Kryndach
Дата 20.4.2007, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 12.4.2007

Репутация: нет
Всего: нет



Спасибо  smile . Конечно программа работает не так как надо но зато не выдает ошибок и пичатает число ( а именно 0   smile ). Дальше попробую исправить , но если ктото напишет действующую программу - пусть выкладывает - потом сравним.
PM MAIL   Вверх
JAPH
Дата 20.4.2007, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 8.1.2007
Где: Ленобласть

Репутация: 5
Всего: 23



Прислушайтесь к DemonFF!
Код

.model    small
.stack 100h 
.code    
        .286                    ; для команды shr al,4    
        org       100h          ; начало СОМ-файла    
start:  mov       ax, @data
        mov       ds,ax
        mov       dx,offset message1
        mov       ah,9    
        int       21h           ; вывести приглашение ко вводу message1    
        mov       dx,offset buffer    
        mov       ah,0Ah    
        int       21h           ; считать строку символов в буфер    
        mov       dx,offset crlf    
        mov       ah,9    
        int       21h           ; перевод строки    
; перевод числа в ASCII-формате из буфера в бинарное число в АХ    
        xor       di,di         ; DI = 0 - номер байта в буфере    
        xor       ax,ax         ; АХ = 0 - текущее значение результата    
        mov       cl,blength    
        xor       ch,ch    
        xor       bx,bx    
        mov       si,cx         ; SI - длина буфера    
        mov       cl,10         ; CL = 10, множитель для MUL    
asc2hex:    
        mov       bl,byte ptr bcontents[di]    
        sub       bl,'0'        ; цифра = код цифры - код символа "0",    
        jb        asc_error     ; если код символа был меньше, чем код "0",    
        cmp       bl,9          ; или больше, чем "9",    
        ja        asc_error     ; выйти из программы с сообщением об ошибке,    
        mul       cx            ; иначе: умножить текущий результат на 10,    
        add       ax,bx         ; добавить к нему новую цифру,    
        inc       di            ; увеличить счетчик    
        cmp       di,si         ; если счетчик+1 меньше числа символов -    
        jb        asc2hex       ; продолжить (счетчик считается от 0)    
; вывод на экран строки message2    
        push      ax            ; сохранить результат преобразования    
        mov       ah,9    
        mov       dx,offset message2    
        int       21h    
        pop       ax    
; вывод на экран числа из регистра АХ    
        push      ax    
        xchg      ah,al         ; поместить в AL старший байт    
        call      print_al      ; вывести его на экран    
        pop       ax            ; восстановить в AL младший байт    
        call      print_al      ; вывести его на экран    
        mov       ax, 4C00h
        int       21h; завершение СОМ-файла    
asc_error:    
        mov       dx,offset err_msg    
        mov       ah,9    
        int       21h           ; вывести сообщение об ошибке    
        mov       ax, 4C00h
        int       21h; и завершить программу    
; Процедура print_al    
; выводит на экран число в регистре AL    
; в шестнадцатеричном формате,    
; модифицирует значения регистров АХ и DX    
print_al:    
        mov       dh,al    
        and       dh,0Fh        ; DH - младшие 4 бита    
        shr       al,4          ; AL - старшие    
        call      print_nibble  ; вывести старшую цифру    
        mov       al,dh         ; теперь AL содержит младшие 4 бита    
print_nibble:                   ; процедура вывода 4 бит (шестнадцатеричной цифры)    
        cmp       al,10         ; три команды, переводящие цифру в AL    
        sbb       al,69h        ; в соответствующий ASCII-код    
        das                     ; (см. описание команды DAS)    
        mov       dl,al         ; код символа в DL    
        mov       ah,2          ; номер функции DOS в АН    
        int       21h           ; вывод символа    
        ret                     ; этот RET работает два раза - один раз    
                                ; для возврата из процедуры print_nibble,    
                                ; вызванной для старшей цифры,    
                                ; и второй раз - для возврата из print_al    
.data
message1 db       "Десятичное число: $"    
message2 db       "Шестнадцатеричное число: $"    
err_msg  db       "Ошибка ввода"    
crlf     db       0Dh,0Ah,'$'    
buffer   db       6             ; максимальный размер буфера ввода    
blength  db       ?             ; размер буфера после считывания    
bcontents equ this byte                      ; содержимое буфера располагается за    
                                ; концом СОМ-файла    
        end       start



--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
Kryndach
Дата 20.4.2007, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 12.4.2007

Репутация: нет
Всего: нет



Всем большое спасибо  smile   smile . Вопрос закрыт
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0506 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.