FASM синтаксис

Тема в разделе "WASM.BEGINNERS", создана пользователем Antolflash, 1 апр 2009.

  1. Antolflash

    Antolflash New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2008
    Сообщения:
    167
    Попытался записать млпдшие два разряда введённого числа и вывести их на экран, вышла какая-то лажа. Поясните в чём проблема.

    Код (Text):
    1. format pe console
    2.     include 'C:\FASM_WINDOWS\include\win32a.inc'
    3.  
    4. push 0
    5. push tmp              
    6. push 25                
    7. push message            
    8. push STD_INPUT_HANDLE  
    9. call [ReadFile]      
    10.  
    11.  
    12. mov al,byte [message+tmp-1]
    13. mov byte [mess],al
    14.  
    15. mov al, byte [message+tmp-2]
    16. mov byte [mess+1],al
    17.  
    18.  
    19. push 0
    20. push tmp              
    21. push 2              
    22. push mess            
    23. push STD_OUTPUT_HANDLE  
    24. call [WriteFile]      
    25.  ;оставляем консоль работающей
    26. push 0
    27. push tmp              
    28. push 25                
    29. push message          
    30. push STD_INPUT_HANDLE  
    31. call [ReadFile]        
    32.  
    33.  
    34.  
    35.  
    36.  
    37.  
    38. push 0
    39. call [ExitProcess]
    40.  
    41.  
    42. tmp dd 0
    43. mess db ' '
    44. message db ' '
    45.  
    46.  
    47. section 'import' import data readable
    48. library kernel32,'kernel32.dll'
    49. include 'C:\FASM_WINDOWS\include\api\kernel32.inc'
     
  2. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    Код (Text):
    1. mov al,byte [message+tmp-1]
    Ты заносишь в AL байт по адресу (адрес_message + АДРЕС_tmp - 1). Тебе это нужно? Правильно (но бессмысленно, см. ниже):
    Код (Text):
    1. mov edx,[tmp]
    2. mov al,byte [message+edx-1]
    3. mov byte [mess],al
    4.  
    5. mov al, byte [message+edx-2]
    6. mov byte [mess+1],al
    Дальше:
    Код (Text):
    1. mess db ' '
    2. message db ' '
    Ты уверен, что собираешься прочитать 25 байт (при вводе числа) в однобайтовый буфер, и записать два байта тоже в однобайтовый (заодно затирая единственный байт message)?
    Код (Text):
    1. mess rb 2
    2. message rb 25
    И наконец, ты уверен, что ты хочешь записать в mess те символы CR LF, которые автоматом добавляются в конец строк при вводе из консоли? :) Но даже если ты бы сделал -3 и -4, ты их записываешь в неправильном порядке!
     
  3. Antolflash

    Antolflash New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2008
    Сообщения:
    167
    Прошу прощения, просто я прогал до этого ассемблерными вставками в MVS, и читал книжку Питера Абеля (она для MASM). Установил Masm32, это оказалось не то, что нужно (искать обычный MASM было лень). Подумал, и решил освоить FASM, а к его синтаксису я не привык.

    Э.... А разве в конце строки не добавляется 0 ????
    Или windowsовский формат ввода-вывода отличается от сишного?

    Есть просьба показать пример проги на FASM, которая принимает на ввод десятичное число, выдаёт младшие два разряда его 16ричного аналога (т.е. младший байт). Это можно сделать одними movами. Да, и как вводить число не через строку, а чтобы как в сях, типа допустимы лишь числа, как при scanf("%i", &var) ?

    P.S. Огромное спасибо за подсказку. Просто туго я что-то в последнее время думаю. Всё это разнообразие синтаксиcов меня начало бесить, не знаю, за что взяться в изучении.
     
  4. Antolflash

    Antolflash New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2008
    Сообщения:
    167
    А... в памяти-то всё храниться побайтно-наоборот. Но на запись строк это тоже распространняется? Т.е. для последних символов мне нужно
    mov al, byte [message+2]; последние два символа строки - пометка о её конце
    mov byte [mess], al;

    mov al, byte [message+3];
    mov byte [mess+1], al;
     
  5. Antolflash

    Antolflash New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2008
    Сообщения:
    167
    Код (Text):
    1. format pe console
    2.     include 'C:\FASM_WINDOWS\include\win32a.inc'
    3.  
    4. push 0
    5. push tmp              
    6. push 25                
    7. push message            
    8. push STD_INPUT_HANDLE  
    9. call [ReadFile]      
    10.  
    11. mov ebx, [tmp];
    12. mov al, byte [message+ebx-4]; ïîñëåäíèå äâà ñèìâîëà ñòðîêè - ïîìåòêà î å¸ êîíöå
    13. mov byte [mess], al;
    14.  
    15. mov al, byte [message+ebx-3];
    16. mov byte [mess+1], al;
    17.  
    18.  
    19. push 0
    20. push tmp              
    21. push 2              
    22. push mess            
    23. push STD_OUTPUT_HANDLE  
    24. call [WriteFile]      
    25.  ;îñòàâëÿåì êîíñîëü ðàáîòàþùåé
    26. push 0
    27. push tmp              
    28. push 25                
    29. push message          
    30. push STD_INPUT_HANDLE  
    31. call [ReadFile]        
    32.  
    33.  
    34.  
    35.  
    36.  
    37.  
    38. push 0
    39. call [ExitProcess]
    40.  
    41.  
    42. tmp dd 0
    43. mess rb 25
    44. message rb 25
    45.  
    46.  
    47. section 'import' import data readable
    48. library kernel32,'kernel32.dll'
    49. include 'C:\FASM_WINDOWS\include\api\kernel32.inc'
     
  6. Antolflash

    Antolflash New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2008
    Сообщения:
    167
    вот теперь работает, только вот, ещё раз повторюсь, как организовать что-то вроде scanf("%i", &var) через функции win API. Просто интересно.
     
  7. Antolflash

    Antolflash New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2008
    Сообщения:
    167
    Вот интересно, scanf при считывании целых чисел, считывает их поразоядно как символы, или есть какой-то механизм, позволяющий выделить меньше памяти буфера (т.е. не по байту на разряд)
     
  8. Antolflash

    Antolflash New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2008
    Сообщения:
    167
    Да, и всё-же, я просто вывожу два последних разряда в 10чной системе, а хотелось бы после ввода представить введёные символы как 16ричное число, поместить их в eax, и вывести al (т.е. остаток деления на 256)
     
  9. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    774
    ...
    ...o 0
    чтё такое stdcall? всмысле я знаю, что это передача параметров справа кажись налево,
    но почему-то стало встречаться такое как альтернатива invoke! а зачем? :)
    да ещё и апи оформленны в виде кусков памяти!
    типа call [ExitProcess]
    А что invoke ExitProcess,0 хуже? или наборот лучше?

    fasm:
    Код (Text):
    1. stdcall [MessageBox],HWND_DESKTOP,szErrTmrSet,szTitle,MB_ICONERROR
     
  10. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    stdcall нагляднее, больше подходит к фасмовому синтаксису:
    Код (Text):
    1. mov eax,foo    ; взяли адрес foo
    2. mov eax,[foo] ; прочитали foo
    3. invoke bar,1  ; вот поди и пойми, что сделали?
    4. stdcall bar,1  ; вызвали функцию bar напрямую.
    5. stdcall [baz],1 ; прочитали указатель на функцию baz и вызвали функцию.
     
  11. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    удобнее это синтаксис вида
    Код (Text):
    1. format PE console
    2. include 'win32ax.inc'
    3. include 'hll_simple.inc'
    4. proc main
    5.      local buf[1024]:BYTE
    6.      local stdout:DWORD
    7.      GetStdHandle(STD_OUTPUT_HANDLE)  mov [stdout],eax
    8.      wsprintfA(buf,"hi!!!%d",111)
    9.      WriteFile([stdout],buf,eax,0,0)
    10.      ret
    11. endp
    12. .end main
     
  12. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    GoldFinch
    тогда уж лучше С
     
  13. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    ohne
    С не лучше, для вызова апи и функций хорошо подходит С-образный синтаксис, для всего остального - асм
     
  14. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    774
    iZzz32, хорошо объяснил! Наглядно! :)
    Но я при обилии инвоков думал, что они более подходят. Вернее я мало ещё видел.
    Впринцыпе это всё хорошо. Но документации на всё единой не хватает. Благо что есть люди вокруг. :)
    GoldFinch, я бы сказал API-образный синтакс. Но ассемблер хорошо организует всё это иначе
    ото начинает разростаться в индусскую граматику, как в неассемблерных языках...
     
  15. AJAJA

    AJAJA New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2009
    Сообщения:
    21
    FASM синтаксис божественен. Воистину на нем создали вселенную.