FASM синтаксис

Discussion in 'WASM.BEGINNERS' started by Antolflash, Apr 1, 2009.

  1. Antolflash

    Antolflash New Member

    Blog Posts:
    0
    Попытался записать млпдшие два разряда введённого числа и вывести их на экран, вышла какая-то лажа. Поясните в чём проблема.

    Code (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

    Blog Posts:
    0
    Code (Text):
    1. mov al,byte [message+tmp-1]
    Ты заносишь в AL байт по адресу (адрес_message + АДРЕС_tmp - 1). Тебе это нужно? Правильно (но бессмысленно, см. ниже):
    Code (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
    Дальше:
    Code (Text):
    1. mess db ' '
    2. message db ' '
    Ты уверен, что собираешься прочитать 25 байт (при вводе числа) в однобайтовый буфер, и записать два байта тоже в однобайтовый (заодно затирая единственный байт message)?
    Code (Text):
    1. mess rb 2
    2. message rb 25
    И наконец, ты уверен, что ты хочешь записать в mess те символы CR LF, которые автоматом добавляются в конец строк при вводе из консоли? :) Но даже если ты бы сделал -3 и -4, ты их записываешь в неправильном порядке!
     
  3. Antolflash

    Antolflash New Member

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

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

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

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

    Antolflash New Member

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

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

    Antolflash New Member

    Blog Posts:
    0
    Code (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

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

    Antolflash New Member

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

    Antolflash New Member

    Blog Posts:
    0
    Да, и всё-же, я просто вывожу два последних разряда в 10чной системе, а хотелось бы после ввода представить введёные символы как 16ричное число, поместить их в eax, и вывести al (т.е. остаток деления на 256)
     
  9. Semiono

    Semiono Member

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

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

    iZzz32 Sergey Sfeli

    Blog Posts:
    0
    stdcall нагляднее, больше подходит к фасмовому синтаксису:
    Code (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

    Blog Posts:
    0
    удобнее это синтаксис вида
    Code (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

    Blog Posts:
    0
    GoldFinch
    тогда уж лучше С
     
  13. GoldFinch

    GoldFinch New Member

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

    Semiono Member

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

    AJAJA New Member

    Blog Posts:
    0
    FASM синтаксис божественен. Воистину на нем создали вселенную.