|
|
| Посл.отвђт | Сообщен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 нет |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.043 |