· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› код символа

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Июн 9, 2003 00:55:34

как вывести под досом не символ а его код???
без макросов,чисто в асме.


Дата: Июн 9, 2003 01:17:19

1.Код состоит из цифр.
2.Пусть нам необходимо перевести код 41 "A".
3.Код цифры это 30 + цифра (31="1";32="2";33="3")...
4.вывод: записали наше 41 в ah
5.маской F0h получили 40 и сдвинули на 4 бита в право. получилось 4
6.прибавили 30h и получили 34h - код символа "4". Вывели его на экран или куда больше хочеться...
7. опять записали 41 в ah.
8.маской 0Fh получили 1.
9.прибавили 30h и получили 31h - код символа "1". Вывели его на экран или куда больше хочеться...

Вот такой алгоритм... Лови кусок кода на вкусное:

push ax

push 0b800h
pop es

push 0а00h
pop bp

shr ax,4
add ax,30h

mov es:[bp],al
mov dx,00001010b
mov es:[bp+1],dx

pop ax
and ax,0fh
add ax,30h

mov es:[bp+2],al
mov dx,00001010b
mov es:[bp+3],dx

в ах аски код символа. этот символ выводиться на экран примилыми зелененькими буквами.
Всего наилутшего. Надеюсь поможет...


Дата: Июн 10, 2003 21:11:24

короче я получаю некий символ.
затем хочу вывести на экран его код (циферки а не символ!!!).
короче код кнопочки хочу ловить.но не знаю как число перевести в строку.
(но только в асме,без макросов)


Дата: Июн 10, 2003 22:49:06

Raven
Принцип понятен, но сам код поясни пожалуста перевод старшей части числа.
Во-вторых ты преобразуеш шестнадцатеричное число (т.к. работаеш с тетрадами) а строка на выходе получится из символов 1234567890 и тех, что по коду следуют за 9 т.е. на экран может выйти число типа 1: или <=. нужно добавить проверку на выход за пределы 9 и добавлять не 30, а 36.
dir_er
Свой адрес напиши вышлю файлик в котором кроме прочего и преобразование числа находящегося в еах в строку. В принципе не очень оптимально, но работает. Правда я пользуюсь под WIN, но переделывать под ДОС помоему не прийдётся. Написан под FASM.


Дата: Июн 11, 2003 02:49:54

dir_er@crazy.ru


Дата: Июн 11, 2003 17:10:10

Отправил.


Дата: Июн 14, 2003 20:40:08

В al= код символа

если код состоит только из чисел от 0 до 9 то:
mov ah,al
shr al,0Fh
or ax,3030h
ax=ASCII код символа

или посмотри описание коданды DAS


Дата: Июн 14, 2003 23:39:29

Как говорил Пифагор: "Мир есть число". А в ассемблере и символы можно рассматривать как числа.

;перевод числа в строку
eaxtostr:;(eax - число, 1<ebx<=36 - основание ,edi - строка)
push edx
div ebx
or eax,eax
jz .l0
call eaxtostr
.l0:
mov dl,[digits+edx]
mov [edi],dl
inc edi
pop edx
ret
digits db '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'

Не очень оптимально по памяти и быстродействию, но зато универсально. Немного поправить и можно в unicode преобразовывать.


Дата: Июн 16, 2003 10:16:00

; tasm %1
; tlink /t /x %1
;
;
.model tiny
.code
org 100h
_start:
;
mov si,offset sHex
xor di,di
scan_No:
lodsb
cmp al,00h
jz end_No
call hex2asc
mov byte ptr sStr[di],ah
mov byte ptr sStr[di+1],al
inc di
inc di
jmp short scan_No
end_No:

mov dx,offset sStr
mov ah,09h
int 21h
ret
;
; Вход:
; AL=число(hex)
; Выход:
; AX=Символьное представление числа
; Пример: AL=29h, AX=3239h
hex2asc proc near
mov ah,al
and ah,0Fh
shr al,4
call @conv
xor al,ah ;\
xor ah,al ; > xchg al,ah
xor al,ah ;/
@conv:
cmp al,10
sbb al,69h
das
ret
hex2asc endp
;
; Строка чисел, которые надо вывести на экран
sHex db 0Ah,23h,48h,4Bh,99h,53h,0 ;(ноль-это признак конца массива чисел)
; Строка для хранения ASCII кодов этих чисел
sStr db 20 dup(0),0Ah,0Dh,24h
end _start


Дата: Июн 17, 2003 06:25:37

А почему просто не написать xchg al,ah?


Дата: Июн 20, 2003 13:52:14

Black_mirror

Почитай книгу Зубкова "Asm для DOS WIN UNIX",
там в описании команды xchg ясно сказано, что xor выполняется бысрее, да и оригинальней так!


Дата: Июн 20, 2003 15:23:00 · Поправил: Black_mirror

KiNDeR

так xchg одна команда а xor'ов целых три!
у Зубкова написано что xchg выполняется за три такта, а xor за один.
Если предположить, что первые 2 xor'а выполнятся вместе (интересно в xor al,ah/xor ah,al есть зависимость по данным?), а третий с какой нибудь еще командой, то выигрыш действительно будет. Но например на Атлоне 1900+ xchg выполняется за 1 такт (правда три xor'а тоже), а в таких условиях выигрыша никакого не будет. Есть даже небольшой проигрыш, видимо из-за того что нужно декодировать больше комманд.


Дата: Июн 21, 2003 19:33:09

Black_mirror

Не спорю, на более новых процессорах, дествительно xchg выполняется быстро, декодирование в 1-3 микрооперации,
но на более старых(в зависимости от типа данных) свыше 4 микроопераций, а это как известно еще один такт, что ни есть гуд!
Подбирая команды, можно сделать так, чтобы все декодировалось в 1 такт, но это уже вопрос низкоуровневой оптимизации.
У меня не быстрый процессор, так что для меня бысрее XOR. У ассемблера один недостаток-это то, что для одного железа быстро, а для другого это может оказаться не так.
Ты не против если, я тебе на мыло буду писать, а то мне даже поговорить не скем про ассемблер. Все себя считают очень умнымы, но не могут обьяснить элементарных вешей.


Дата: Июн 22, 2003 16:26:23

KiNDeR

А можно узнать какой у тебя процессор? Я вот проверил все это еще на PIII 667Mz и там xor значительно отставал от xchg. Четыре xchg выполняется чуть менее чем за 6 тактов, а 4 группы по 3 xor'а за 11 тактов. На моем процессоре 4 и 5 тактов соответственно, хотя для 3х групп xor'ов получается 3 такта. Я тут везде вычел по 2 такта на организацию цикла, хотя это не совсем корректно.

Пиши, по поводу асма я тоже поговорить люблю, только вот объяснять я не очень умею.


Дата: Июн 24, 2003 14:17:33

xchg блокирует шину на время работы и соответственно конвеер.
а xor нет

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.043