Никак не могу привыкнуть к записи чисел вида 01234h Можно ли как-то научить масм понимать числа в формате 0x1234 ?
0) написать макрос 1) поправить интерпретатор 2) использовать fasm (он даже делфивский формат понимает, ну этот $1234)
Про макрос можно подробнее? Мне нужно, чтобы писать не вот так: mov eax, somemacro(0x1234), а вот так: mov eax, 0x1234 Как это в виде макроса оформить? Фасм не подходит по ряду причин к сожалению.
Хотел. Но увы. Слишком много исправлять прийдется, плюс переделывать таблицы. Да и не о фасме речь в общем-то
dyn, Можно распарсить источник (константа ведь всегда источник в инструкции, так?) как указано ниже: Код (Text): movx macro dst, src local srcindex, still_looks_like_0x, new_src srcindex = 0 still_looks_like_0x = 1 new_src = 0 irpc cc, <src> if srcindex eq 0 ifdif <cc>, <0> still_looks_like_0x = 0 exitm; не оно endif srcindex = srcindex+1 elseif srcindex eq 1 ifdif <cc>, <x> still_looks_like_0x = 0 exitm; опять же не оно endif srcindex = srcindex+1 else new_src = new_src shl 4 or cc; оно — конвертим endif endm if still_looks_like_0x mov dst, new_src; употребляем результат else mov dst, src; не вышло, пусть будет как есть endif endm Написано на коленке, ну и mov в MASM — зарезервированое слово. Хрен переопределишь.
вариант 1: .radix 16 вариант 2: for i0,<0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f> %@CatStr(_x,i0) equ @CatStr(0,i0,h) for i1,<0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f> %@CatStr(_x,i1,i0) equ @CatStr(0,i1,i0,h) for i2,<0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f> %@CatStr(_x,i2,i1,i0) equ @CatStr(0,i2,i1,i0,h) for i3,<0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f> %@CatStr(_x,i3,i2,i1,i0) equ @CatStr(0,i3,i2,i1,i0,h) endm endm endm endm mov eax, _xdead ну и т.д. в глубину. два минуса - формат "чисел" не 0x###, а _x###, поскольку 0 в начало имени никак не лезет. - скорость компиляции (для 4-значных - 1,33 сек) вариант 3: патчить ml.exe, но на это весь вечер уйдет.
wild_cosine, А для 32/64-битных? Моё мнение, вариант 2 обделается. Насчёт патча ml.exe я уже думаю (будет забавно).
Предлагаю универсальный препроцессор элементарно решающий задачу. Код (Text): ;----------------------------------------------------------------------------------------------------- ; Можно ли как-то научить масм понимать числа в формате 0x1234 ? ; Это препроцессор. Настройте только передачу асм-файла. ; И опционально дописать процедуры обработки неоткрытия файлов msvcrt-ой. ; ; paralvic@mail.ru ;----------------------------------------------------------------------------------------------------- .586p ; староватые инструкции. .MMX .XMM .model flat, stdcall option casemap :none ; регистрозависимы include \MASM32\INCLUDE\kernel32.inc ; Только из-за GetCommandLine includelib \masm32\LIB\kernel32.lib include \MASM32\INCLUDE\msvcrt.inc includelib \masm32\LIB\msvcrt.lib FALSE equ 0 TRUE equ -1 SEEK_END equ 2 SEEK_SET equ 0 ;----------------------------------------------------------------------------------------------------- ; Стандартные макросы. ;----------------------------------------------------------------------------------------------------- literal_string macro lit_string local local_string .data align 4 local_string db lit_string, 0 .code exitm <local_string> endm CSTR macro lit_string exitm <offset literal_string(lit_string)> endm ;----------------------------------------------------------------------------------------------------- m2m MACRO M1, M2 push M2 pop M1 ENDM ;----------------------------------------------------------------------------------------------------- .data fh dd 0 ; хендлы файлов fh2 dd 0 maxpos dd 0 ; сюда запишем размер файла. ecx_ dd 0 ; а это просто переменная для цикла, сначала = maxpos record_ db 5 dup(" paralvic@mail.ru") ; буфер для чтения-записи Buff dw 0 fType dd 0 ; флаг, разрешающий печать. fDig dd 0 ; флаг, показывающий, что обрабатываем цифру. itsall db 0dh,0ah,0dh,0ah,";) It's all ;)" itsalll equ $ - offset itsall CommandLine dd 0 aCommandLineEnd dd 0 aParam dd 0 .code S_T_A_R_T: ; <<< тут вставьте GetCommandLine >>> invoke GetCommandLine mov CommandLine, eax mov edi, eax xor eax,eax mov ecx, 512 repne scasb sub ecx,512 not ecx ; положение нуля относительно начала dec edi mov aCommandLineEnd, edi mov al,"/" mov edi, CommandLine repne scasb jcxz @F ; а если параметра нет, то на выход jmp m @@: jmp Finish ; дальний переход m: mov aParam, edi ; <<< вставил GetCommandLine >>> ;-------------------------------------------------------------------------------------------------------- ; Открываем исходный. ;----------------------------------------------------------------------------------------------------- invoke crt_fopen, aParam, CSTR("r") ;0 - ошибка mov fh, eax invoke crt_fseek, fh, 0, SEEK_END invoke crt_fgetpos, fh, addr maxpos invoke crt_fseek, fh, 0, SEEK_SET ; таким хитрым способом узнаем размер файла ;----------------------------------------------------------------------------------------------------- ; Открываем установочный. ;----------------------------------------------------------------------------------------------------- mov eax, aCommandLineEnd ; дописываем "_" в конце имени файла. mov word ptr [eax], 0005fh invoke crt_fopen, aParam, CSTR("w") mov fh2, eax ;----------------------------------------------------------------------------------------------------- ; Перебираем исходный в установочный. ;----------------------------------------------------------------------------------------------------- m2m ecx_, maxpos go__: mov fType, TRUE ; флаг означающий будем ли переписывать символ invoke crt_fread, addr record_, 1, 1, fh ; читаем .if eax == 1 ;;; shl Buff, 8 mov al, record_ add byte ptr Buff, al .if Buff == "0x" ; попалась цифра, думаю в строках не будешь включать. mov fDig, TRUE mov fType, FALSE .else .if fDig == TRUE cmp record_,"0" ; Проверим дальше закончилась ли цифра. jb notDig cmp record_,"9" jbe Dig cmp record_,"A" jb notDig cmp record_,"F" jbe Dig cmp record_,"a" jb notDig cmp record_,"f" jbe Dig notDig: mov fDig, FALSE invoke crt_fwrite, CSTR("h"), 1, 1, fh2; invoke crt_fwrite, addr record_, 1, 1, fh2; mov fType, FALSE Dig: .endif .endif .if fType invoke crt_fwrite, addr record_, 1, 1, fh2; .endif .endif ;;; dec ecx_ jnz go__ .if fDig invoke crt_fwrite, CSTR("h"), 1, 1, fh2 ; символов больше нет, но цифра не закончилась. .endif invoke crt_fwrite, addr itsall, itsalll, 1, fh2 invoke crt_fflush, fh2 ; сброс буферов в файл invoke crt_fclose, fh ; закрытие файла invoke crt_fclose, fh2 ; закрытие файла Finish: invoke ExitProcess, 0 ret end S_T_A_R_T ;21.12.2010 Пример использования ниже. Есть смысл обсуждать тему дальше?