Size: a a a

Ассемблер

2021 August 07

aq

anonim qwerty in Ассемблер
Там чёрт ногу сломит
источник

E

Entusiast in Ассемблер
Тебе не нужен винапи для асма
Тебе нужно соглашение о вызове, и WinApi функции (их символы, DLL), и их аргументы

Заходишь на docs.microsoft.com
Пишешь название функции, видишь аргументы, и вызываешь её используя нужное соглашение о вызове
источник

aq

anonim qwerty in Ассемблер
Это как
источник

E

Entusiast in Ассемблер
Дописал.
источник

aq

anonim qwerty in Ассемблер
К примеру. Мне нужно найти функцию, которая будет принимать текст с клавы
источник

aq

anonim qwerty in Ассемблер
Как это найти?
источник

E

Entusiast in Ассемблер
На x86 много думать не надо, там стэк:
push arg1
push arg2
call dword[Function]

На x64 читай тут:
https://docs.microsoft.com/en-us/cpp/build/x64-calling-convention?view=msvc-160
источник

ST

Saenro T in Ассемблер
Возможно так тоже можно, но я не проверял в TASMe:

push  @data
pop   es
mov   ax, 1
mov   bx, ax
mov   di, offset fibonacci
mov   cx, 12
next: stosw
xchg  ax, bx
add   ax, bx
loop  next
ret
источник

aq

anonim qwerty in Ассемблер
Зачем в стек дату сохранять?
источник

ST

Saenro T in Ассемблер
Ну так по байтам экономнее
источник

ST

Saenro T in Ассемблер
Привычка
источник

E

Entusiast in Ассемблер
Саму функцию ищи в гугле по несформированному запросу - "WinApi read console"
Через поиск получаешь функцию ReadConsoleA
Заходишь на docs.microsoft.com, пишешь (справа вверху Search) ReadConsoleA (https://docs.microsoft.com/en-us/windows/console/readconsole)

Видишь аргументы, и в связи с соглашением о вызове передаёшь их функции. На x86 будет слева направо, через стэк. Т.е сначала берёшь последний аргумент функции, смотришь, что ему нужно, как он работает, и после того, как понял, пишешь:
{
В самом начале есть функция, которой требуется дескриптор, дескриптор получается другой функцией. Желательно сначала получить нужные дескрипторы для работы, а потом работать с основной функцией.
ReadConsoleA нужен дескриптор на ввод в консоль - hConsoleInput
Заходишь на ссылку в описании аргумента (Console Buffer Security and Access Rights), и видишь функции, в которых упоминается этот раздел - CreateFile, CreateConsoleScreenBuffer, GetStdHandle, внимательно прочитав каждую, ты поймёшь, что тебе нужен GetStdHandle (Retrieves a handle to the specified standard device) - в нём есть аргумент STD_INPUT_HANDLE, отвечающий за "The standard input device. Initially, this is the console"
Передаёшь функции определение STD_INPUT_HANDLE, которое ниже - "-10", и он тебе возвращает хэндл для hConsoleInput:
push -10
call dword[GetStdHandle]
}

(Итак, слева-направа (с конца), через стэк - x86):
push 0 ; Последний параметр ReadConsoleA - pInputControl, читаешь - "For ANSI mode, set this parameter to NULL.", пишешь 0 для ANSI
Потом следующий аргумент с конца - lpNumberOfCharsRead
Читаешь, что ему нужен "pointer", т.е указатель, т.е адрес. Сам аргумент нужен для передачи символов, которые были считаны (написано на том же MSDN):
Объявляешь DWORD (в аргументах смотри принимаемый тип данных):
charsRead dd 0
И передаёшь указатель:
push charsRead
Дальше - nNumberOfCharsToRead - читаешь - (в общем) "сколько нужно считать символов", и пишешь:
push 128 ; Вместо 128 передаёшь сколько тебе нужно. Обычно нужно передавать размер, равный размеру массива, в который ты считываешь

lpBuffer - сам массив, куда ты считываешь данные, нужен указатель
Объявляешь этот массив:
buf db 128 dup(0)
И передаёшь адрес (указатель):
push buf

Далее нужен полученный ранее дескриптор на ввод. GetStdHandle должен был вернуть тебе его в EAX, после проверки на то, правильное ли он значение тебе вернул (смотри в MSDN раздел "Return value", там написаны значения, которые функция возвращает при неверном поведении), передаёшь его в ReadConsoleA
push eax

Ну и вызываешь функцию:
call dword[ReadConsoleA]


Общий код будет выглядеть так:
; Это в .data
charsReaded dd 0  ; Сколько байтов успешно прочитано
buf db 128 dup(0) ; Здесь будут прочитанные данные
sizeof.buf = $ - buf

; Код
push -10 ; STD_INPUT_HANDLE
call dword[GetStdHandle]
test eax, eax
jle .error ; Прыгнуть на .error, если вернулся неверный дескриптор для ввода в консоль

push 0
push charsReaded
push sizeof.buf
push buf
push eax
call dword[ReadConsole]
источник

P

ProMiNick in Ассемблер
самому обрабатывать флоаты, и заменять в строке форматирования %f на %s
источник

LG

Lena Golovach in Ассемблер
источник

ВН

Восемь Ног in Ассемблер
Ребята, подскажите нубу.

mov es:[di],ax - в TASM`е данная команда заносит содержимое ax в es:(адрес содержимого di)

Как переписать для FASM`а?
источник

ST

Saenro T in Ассемблер
stosw делает тоже самое.
Ой, не тоже самое, оно ещё делает di+2 с каждой итерацией
источник

ВН

Восемь Ног in Ассемблер
Хорошо, но все-таки, как бы мне через mov написать?
источник

ST

Saenro T in Ассемблер
mov [es:di], ax ?
источник

ВН

Восемь Ног in Ассемблер
Думаю, что нет, т.к. нужно значение из es
а из di нужно взять адрес и значение оттуда
источник

s

s54816 in Ассемблер
В фасме сегмент пишется внутри квадратных скобок, так логичнее, потому что он часть адреса.
источник