Попытался записать млпдшие два разряда введённого числа и вывести их на экран, вышла какая-то лажа. Поясните в чём проблема. Код (Text): format pe console include 'C:\FASM_WINDOWS\include\win32a.inc' push 0 push tmp push 25 push message push STD_INPUT_HANDLE call [ReadFile] mov al,byte [message+tmp-1] mov byte [mess],al mov al, byte [message+tmp-2] mov byte [mess+1],al push 0 push tmp push 2 push mess push STD_OUTPUT_HANDLE call [WriteFile] ;оставляем консоль работающей push 0 push tmp push 25 push message push STD_INPUT_HANDLE call [ReadFile] push 0 call [ExitProcess] tmp dd 0 mess db ' ' message db ' ' section 'import' import data readable library kernel32,'kernel32.dll' include 'C:\FASM_WINDOWS\include\api\kernel32.inc'
Код (Text): mov al,byte [message+tmp-1] Ты заносишь в AL байт по адресу (адрес_message + АДРЕС_tmp - 1). Тебе это нужно? Правильно (но бессмысленно, см. ниже): Код (Text): mov edx,[tmp] mov al,byte [message+edx-1] mov byte [mess],al mov al, byte [message+edx-2] mov byte [mess+1],al Дальше: Код (Text): mess db ' ' message db ' ' Ты уверен, что собираешься прочитать 25 байт (при вводе числа) в однобайтовый буфер, и записать два байта тоже в однобайтовый (заодно затирая единственный байт message)? Код (Text): mess rb 2 message rb 25 И наконец, ты уверен, что ты хочешь записать в mess те символы CR LF, которые автоматом добавляются в конец строк при вводе из консоли? Но даже если ты бы сделал -3 и -4, ты их записываешь в неправильном порядке!
Прошу прощения, просто я прогал до этого ассемблерными вставками в MVS, и читал книжку Питера Абеля (она для MASM). Установил Masm32, это оказалось не то, что нужно (искать обычный MASM было лень). Подумал, и решил освоить FASM, а к его синтаксису я не привык. Э.... А разве в конце строки не добавляется 0 ???? Или windowsовский формат ввода-вывода отличается от сишного? Есть просьба показать пример проги на FASM, которая принимает на ввод десятичное число, выдаёт младшие два разряда его 16ричного аналога (т.е. младший байт). Это можно сделать одними movами. Да, и как вводить число не через строку, а чтобы как в сях, типа допустимы лишь числа, как при scanf("%i", &var) ? P.S. Огромное спасибо за подсказку. Просто туго я что-то в последнее время думаю. Всё это разнообразие синтаксиcов меня начало бесить, не знаю, за что взяться в изучении.
А... в памяти-то всё храниться побайтно-наоборот. Но на запись строк это тоже распространняется? Т.е. для последних символов мне нужно mov al, byte [message+2]; последние два символа строки - пометка о её конце mov byte [mess], al; mov al, byte [message+3]; mov byte [mess+1], al;
Код (Text): format pe console include 'C:\FASM_WINDOWS\include\win32a.inc' push 0 push tmp push 25 push message push STD_INPUT_HANDLE call [ReadFile] mov ebx, [tmp]; mov al, byte [message+ebx-4]; ïîñëåäíèå äâà ñèìâîëà ñòðîêè - ïîìåòêà î å¸ êîíöå mov byte [mess], al; mov al, byte [message+ebx-3]; mov byte [mess+1], al; push 0 push tmp push 2 push mess push STD_OUTPUT_HANDLE call [WriteFile] ;îñòàâëÿåì êîíñîëü ðàáîòàþùåé push 0 push tmp push 25 push message push STD_INPUT_HANDLE call [ReadFile] push 0 call [ExitProcess] tmp dd 0 mess rb 25 message rb 25 section 'import' import data readable library kernel32,'kernel32.dll' include 'C:\FASM_WINDOWS\include\api\kernel32.inc'
вот теперь работает, только вот, ещё раз повторюсь, как организовать что-то вроде scanf("%i", &var) через функции win API. Просто интересно.
Вот интересно, scanf при считывании целых чисел, считывает их поразоядно как символы, или есть какой-то механизм, позволяющий выделить меньше памяти буфера (т.е. не по байту на разряд)
Да, и всё-же, я просто вывожу два последних разряда в 10чной системе, а хотелось бы после ввода представить введёные символы как 16ричное число, поместить их в eax, и вывести al (т.е. остаток деления на 256)
... ...o 0 чтё такое stdcall? всмысле я знаю, что это передача параметров справа кажись налево, но почему-то стало встречаться такое как альтернатива invoke! а зачем? да ещё и апи оформленны в виде кусков памяти! типа call [ExitProcess] А что invoke ExitProcess,0 хуже? или наборот лучше? fasm: Код (Text): stdcall [MessageBox],HWND_DESKTOP,szErrTmrSet,szTitle,MB_ICONERROR
stdcall нагляднее, больше подходит к фасмовому синтаксису: Код (Text): mov eax,foo ; взяли адрес foo mov eax,[foo] ; прочитали foo invoke bar,1 ; вот поди и пойми, что сделали? stdcall bar,1 ; вызвали функцию bar напрямую. stdcall [baz],1 ; прочитали указатель на функцию baz и вызвали функцию.
удобнее это синтаксис вида Код (Text): format PE console include 'win32ax.inc' include 'hll_simple.inc' proc main local buf[1024]:BYTE local stdout:DWORD GetStdHandle(STD_OUTPUT_HANDLE) mov [stdout],eax wsprintfA(buf,"hi!!!%d",111) WriteFile([stdout],buf,eax,0,0) ret endp .end main
ohne С не лучше, для вызова апи и функций хорошо подходит С-образный синтаксис, для всего остального - асм
iZzz32, хорошо объяснил! Наглядно! Но я при обилии инвоков думал, что они более подходят. Вернее я мало ещё видел. Впринцыпе это всё хорошо. Но документации на всё единой не хватает. Благо что есть люди вокруг. GoldFinch, я бы сказал API-образный синтакс. Но ассемблер хорошо организует всё это иначе ото начинает разростаться в индусскую граматику, как в неассемблерных языках...