Как научить MASM понимать числа в формате 0x1234

Тема в разделе "WASM.BEGINNERS", создана пользователем dyn, 19 дек 2010.

  1. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    Никак не могу привыкнуть к записи чисел вида 01234h
    Можно ли как-то научить масм понимать числа в формате 0x1234 ?
     
  2. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    0) написать макрос
    1) поправить интерпретатор
    2) использовать fasm (он даже делфивский формат понимает, ну этот $1234)
     
  3. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    Про макрос можно подробнее?

    Мне нужно, чтобы писать не вот так: mov eax, somemacro(0x1234),
    а вот так: mov eax, 0x1234
    Как это в виде макроса оформить?

    Фасм не подходит по ряду причин к сожалению.
     
  4. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    dyn
    напиши препроцессор простенький :) или подправь фас чтобы генерил "правильные" опкоды.
     
  5. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    Хотел. Но увы. Слишком много исправлять прийдется, плюс переделывать таблицы. Да и не о фасме речь в общем-то :)
     
  6. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    dyn
    препроцессор чем не подходит?
     
  7. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    Писать много нужно. Думал можно макросом в несколько строчек отделаться :)
     
  8. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    dyn,

    Можно распарсить источник (константа ведь всегда источник в инструкции, так?) как указано ниже:
    Код (Text):
    1. movx macro dst, src
    2.   local srcindex, still_looks_like_0x, new_src
    3.   srcindex = 0
    4.   still_looks_like_0x = 1
    5.   new_src = 0
    6.   irpc cc, <src>
    7.     if srcindex eq 0
    8.       ifdif <cc>, <0>
    9.         still_looks_like_0x = 0
    10.         exitm; не оно
    11.       endif
    12.       srcindex = srcindex+1
    13.     elseif srcindex eq 1
    14.       ifdif <cc>, <x>
    15.         still_looks_like_0x = 0
    16.         exitm; опять же не оно
    17.       endif
    18.       srcindex = srcindex+1
    19.     else
    20.       new_src = new_src shl 4 or cc; оно — конвертим
    21.     endif
    22.   endm
    23.   if still_looks_like_0x
    24.     mov   dst, new_src; употребляем результат
    25.   else
    26.     mov   dst, src; не вышло, пусть будет как есть
    27.   endif
    28. endm
    Написано на коленке, ну и mov в MASM — зарезервированое слово. Хрен переопределишь. :derisive:
     
  9. wild_cosine

    wild_cosine New Member

    Публикаций:
    0
    Регистрация:
    19 дек 2010
    Сообщения:
    11
    вариант 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, но на это весь вечер уйдет.
     
  10. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    wild_cosine,

    А для 32/64-битных? Моё мнение, вариант 2 обделается. :derisive:

    Насчёт патча ml.exe я уже думаю (будет забавно).
     
  11. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    Предлагаю универсальный препроцессор элементарно решающий задачу.
    Код (Text):
    1. ;-----------------------------------------------------------------------------------------------------
    2. ; Можно ли как-то научить масм понимать числа в формате 0x1234 ?
    3. ; Это препроцессор. Настройте только передачу асм-файла.
    4. ; И опционально дописать процедуры обработки неоткрытия файлов msvcrt-ой.
    5. ;
    6. ; paralvic@mail.ru
    7. ;-----------------------------------------------------------------------------------------------------
    8.     .586p           ; староватые инструкции.
    9.     .MMX
    10.     .XMM
    11.     .model flat, stdcall
    12.     option casemap :none    ; регистрозависимы
    13.     include \MASM32\INCLUDE\kernel32.inc        ; Только из-за GetCommandLine
    14.     includelib \masm32\LIB\kernel32.lib
    15.     include \MASM32\INCLUDE\msvcrt.inc
    16.     includelib \masm32\LIB\msvcrt.lib
    17.  
    18.     FALSE equ 0
    19.     TRUE equ -1
    20.     SEEK_END equ 2
    21.     SEEK_SET equ 0
    22. ;-----------------------------------------------------------------------------------------------------
    23. ; Стандартные макросы.
    24. ;-----------------------------------------------------------------------------------------------------
    25. literal_string  macro   lit_string
    26.         local   local_string
    27.  
    28.         .data
    29.         align   4
    30. local_string    db      lit_string, 0
    31.  
    32.         .code
    33.         exitm   <local_string>
    34.         endm
    35. CSTR        macro   lit_string
    36.         exitm   <offset literal_string(lit_string)>
    37.         endm
    38. ;-----------------------------------------------------------------------------------------------------
    39. m2m MACRO M1, M2
    40.         push M2
    41.         pop  M1
    42. ENDM
    43. ;-----------------------------------------------------------------------------------------------------
    44. .data
    45.     fh  dd 0                ; хендлы файлов
    46.     fh2 dd 0
    47.     maxpos  dd 0                ; сюда запишем размер файла.
    48.     ecx_    dd 0                ; а это просто переменная для цикла, сначала = maxpos
    49.     record_ db 5 dup("  paralvic@mail.ru")  ; буфер для чтения-записи
    50.     Buff    dw 0
    51.     fType   dd 0                ; флаг, разрешающий печать.
    52.     fDig    dd 0                ; флаг, показывающий, что обрабатываем цифру.
    53.     itsall  db 0dh,0ah,0dh,0ah,";)  It's all  ;)"
    54.     itsalll equ $ - offset itsall
    55.     CommandLine dd 0
    56.     aCommandLineEnd dd 0
    57.     aParam      dd 0
    58. .code
    59. S_T_A_R_T:
    60.     ; <<< тут вставьте GetCommandLine >>>
    61.     invoke GetCommandLine
    62.     mov CommandLine, eax
    63.     mov edi, eax
    64.     xor eax,eax
    65.     mov ecx, 512
    66.     repne scasb
    67.     sub ecx,512
    68.     not ecx         ; положение нуля относительно начала
    69.     dec edi
    70.     mov aCommandLineEnd, edi
    71.  
    72.     mov al,"/"
    73.     mov edi, CommandLine
    74.     repne scasb
    75.     jcxz @F         ; а если параметра нет, то на выход
    76.     jmp m
    77. @@: jmp Finish      ; дальний переход
    78. m:  mov aParam, edi
    79.     ; <<< вставил GetCommandLine >>>
    80. ;--------------------------------------------------------------------------------------------------------
    81. ; Открываем исходный.
    82. ;-----------------------------------------------------------------------------------------------------
    83.     invoke crt_fopen, aParam, CSTR("r") ;0 - ошибка
    84.     mov fh, eax
    85.  
    86.     invoke crt_fseek, fh, 0, SEEK_END
    87.     invoke crt_fgetpos, fh, addr maxpos
    88.     invoke crt_fseek, fh, 0, SEEK_SET       ; таким хитрым способом узнаем размер файла
    89. ;-----------------------------------------------------------------------------------------------------
    90. ; Открываем установочный.
    91. ;-----------------------------------------------------------------------------------------------------
    92.         mov eax, aCommandLineEnd        ; дописываем "_" в конце имени файла.
    93.         mov word ptr [eax], 0005fh
    94.     invoke crt_fopen, aParam, CSTR("w")
    95.     mov fh2, eax
    96. ;-----------------------------------------------------------------------------------------------------
    97. ; Перебираем исходный в установочный.
    98. ;-----------------------------------------------------------------------------------------------------
    99.     m2m ecx_, maxpos               
    100. go__:
    101.     mov fType, TRUE                 ; флаг означающий будем ли переписывать символ
    102.     invoke crt_fread, addr record_, 1, 1, fh    ; читаем
    103.     .if eax == 1    ;;;
    104.     shl Buff, 8
    105.     mov al, record_
    106.     add byte ptr Buff, al
    107.     .if Buff == "0x"                ; попалась цифра, думаю в строках не будешь включать.
    108.         mov fDig, TRUE
    109.         mov fType, FALSE
    110.     .else
    111.  
    112.         .if fDig == TRUE
    113.             cmp record_,"0"         ; Проверим дальше закончилась ли цифра.
    114.             jb notDig
    115.             cmp record_,"9"
    116.             jbe Dig
    117.             cmp record_,"A"
    118.             jb notDig
    119.             cmp record_,"F"
    120.             jbe Dig
    121.             cmp record_,"a"
    122.             jb notDig
    123.             cmp record_,"f"
    124.             jbe Dig
    125. notDig:
    126.                 mov fDig, FALSE
    127.                 invoke crt_fwrite, CSTR("h"), 1, 1, fh2;
    128.                 invoke crt_fwrite, addr record_, 1, 1, fh2;
    129.                 mov fType, FALSE
    130. Dig:
    131.         .endif
    132.     .endif
    133.     .if fType
    134.         invoke crt_fwrite, addr record_, 1, 1, fh2;
    135.     .endif
    136.     .endif  ;;;
    137.     dec ecx_
    138.     jnz go__
    139.     .if fDig
    140.         invoke crt_fwrite, CSTR("h"), 1, 1, fh2     ; символов больше нет, но цифра не закончилась.
    141.     .endif
    142.     invoke crt_fwrite, addr itsall, itsalll, 1, fh2
    143.     invoke crt_fflush, fh2              ; сброс буферов в файл
    144.     invoke crt_fclose, fh               ; закрытие файла
    145.     invoke crt_fclose, fh2              ; закрытие файла
    146. Finish:
    147.     invoke ExitProcess, 0
    148.     ret
    149. end S_T_A_R_T
    150. ;21.12.2010
    Пример использования ниже.
    Есть смысл обсуждать тему дальше?
     
  12. LazzY

    LazzY New Member

    Публикаций:
    0
    Регистрация:
    6 мар 2006
    Сообщения:
    123
    предлагаю терпеть.
    а то потом будете шарить свой код и след девелопер оч. удивится :F
     
  13. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    paralvic,

    Мощная штука. Даже внутри строковых литералов меняет. :derisive: