Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сделал перекодировку ASCII в HEX-байт, Оцените. 
:(
    Опции темы
Ruterian
Дата 17.1.2004, 01:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 9.1.2004
Где: Вязьма, Минск

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



Вот. Делаю такое в первый раз. Все работает. Нельзя ли ее упростить? Лучше раскритикуйте, но не молчите :-)

cseg segment byte
assume cs:cseg,ds:cseg
.286
org 100h
start:


; Конвертор ASCII слова в HEX-значение (1 байт)
start1:
; Вход - AX
; выход - AH

mov ax, 3030h


call ascii2hex

int 20h

;----- вот, собственно процедура ----------

ascii2hex:
push bx
push cx
push dx
mov bl,ah ;Разделяем ASCII символы. Помещаем первый символ в BL
mov dl,al ;а второй - в DL...
cmp bl,40h ;сравним, т.к. ASCII символы букв начинаются с 41h

jg bolshe ;ага, это у нас буква - переходим к ее обработке
cmp bl,30h
jl er_name
sub bl,30h ;если это цифра - отнимаем 30h, т.к. ASCII цифры начин. на 30h
cmp bl,09h
jg er_name ;все эти навороты с проверками - для исключения ложного конвертирования всякой ASCII дряни
mov ch,bl ;полученное число заносим в CH
jmp ed ;и переходим к обработке второго ASCII символа

bolshe:
cmp bl,46h
jg er_name
sub bl,37h ;Мучаем еще первый символ, если он буква - преобразуем в число
mov ch,bl ;полученное число заносим в CH
;Усе, с первым ASCII разобрались полностью, нюхаем далее...
ed: ;Начинаем обработку второго символа
cmp dl,40h ;И делаем это точно также, как и с первым
jg bolshe1
cmp dl,30h
jl er_name
sub dl,30h
cmp dl,09h
jg er_name
mov cl,dl
jmp ec

bolshe1: ;И также мучаем. Единственная разница
cmp dl,46h
jg er_name
sub dl,37h ;в том, что вместо CH мы заполняем CL
mov cl,dl ; Теперь у нас в CX число вида 070A
; А надо что-то типа 007A :-)
ec:
mov al,ch ; сохраняем старшее число в AL для умножения
mov bl,10h ; сюды пишем множитель
mul bl ;умножаем на 16 - и получаем перевернутые полубайты в AX
add al,cl ;а второе число просто прибавляем - и получаем точный рез-тат

rest:
pop dx
pop cx
pop bx
retn

er_name:
mov ah,09h
lea dx,er_name_mes
int 21h
jmp rest

er_name_mes db '-говняный ASCII-код! $'

cseg ends
end start
PM MAIL WWW ICQ   Вверх
Serzh
Дата 17.1.2004, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код
mov al,ch; сохраняем старшее число в AL для умножения
mov bl,10h; сюды пишем множитель
mul bl;умножаем на 16 - и получаем перевернутые полубайты в AX
add al,cl;а второе число просто прибавляем - и получаем точный рез-тат

лучше так:
Код
mov al,ch; сохраняем старшее число в AL для умножения
shl al,4; сдвигаем на 4 бита
or al,cl;а второе число просто логически прибавляем - и получаем точный рез-тат

остольное подправить мона, но я спросоня smile.gif
PM MAIL WWW ICQ   Вверх
Chingachguk
Дата 17.1.2004, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Проверку первого и второго полубайта лучше все-же сделать в цикле, а не дублировать код. Или написать подпрограмму проверки символа и звать ее два раза. Например:

Цитата

; Считаем, что в ax - два символа, шестнадцатеричное представление байта - например, "A7".
; "7" в AL, "A" - в AH
pusha ; сохраняем все регистры кроме сегментных одной командой
mov bx,ax ; Храним символы в BX
xor  dx,dx ; Результат будет в DX
mov cx,2 ; 2 символа - 2 шага цикла
@@CheckRangeAndConvert:
  mov  al,bl
  mov  ah,'0' Базовый символ для вычитания
  ; Проверяем диапазон
  cmp  al,'0'
  jb    @@ErrorFormat
  cmp  al,'9'
  jbe  @@FormatOK
  mov  ah,'A'-10 Базовый символ для вычитания
  ; Проверяем диапазон ['A'..'F']
  cmp  al,'A'
  jb    @@ErrorFormat
  cmp  al,'F'
  jbe  @@FormatOK
  mov  ah,'a'-10 Базовый символ для вычитания
  ; Проверяем диапазон ['a'..'f']
  cmp  al,'a'
  jb    @@ErrorFormat
  cmp  al,'f'
  ja    @@ErrorFormat
@@FormatOK:
  ; Теперь у нас может быть:
  ; 1. AL = '0'..'9' и AH='0'
  ; 2. AL = 'A'..'F' и AH='A'-10
  ; 3. AL = 'a'..'f' и AH='a'-10
  ; Вычитая из AL AH получим соответствие: "0..9" - > 0..9, "A(a)..F(f)" - > 10..15
  sub  al,ah ; Приводим символ к числу, ему соответствующему
  ; Учитываем в накопителе (DX) полученный полубайт

  ...

  mov  bl,bh ; Следующий символ (второй)
  loop @@CheckRangeAndConvert
; Что-то делаем с результатом
...
@@ErrorFormat:
popa ; восстанавливаем все регистры, кроме сегментных



--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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