Мне надо разобраться в следующем... Использую IDE RadAsm 2.2.2.3 Процедуру можно вызвать несколькими способами. Например, Код (Text): invoke proc, arg1, arg2 Или так: Код (Text): push arg1 push arg2 call proc В чём разница? Как сделать хорошо? Дальше, ради примера... Как передать строку, символ, чтобы добавить этот символ к строке и вернуть эту строку в место вызова для того, чтобы вывести её на экран? Как вообще это делается? Другой пример, надо удалить все пробелы из переменной, которую я получил в процедуре в виде аргумента. У меня также стоит masm32 editor. Как основание для любой программы использую следующий код. Код (Text): .386 .model flat, stdcall option casemap: none include /masm32/include/windows.inc include /masm32/include/user32.inc include /masm32/include/kernel32.inc includelib /masm32/lib/user32.lib includelib /masm32/lib/kernel32.lib .data msg_title db "Title", 0 msg_message db "Hello world", 0 .code start: invoke MessageBox, 0, addr msg_message, addr msg_title, MB_OK invoke ExitProcess, 0 end start
Разницы нет: https://docs.microsoft.com/en-us/cpp/assembler/masm/invoke?view=vs-2019 Уточните, откуда что вам нужно получить и куда вывести. Код в вашем примере - программа под Windows, выводящая окно с сообщением, так называемый Message Box. Это просто текстовый редактор. С тем же успехом вы можете использовать notepad.
Надо передать строку и символ. В конце её присоединить его. Когда эта процедура вернётся, вывести строку на экран.
Я бы использовал для ввода и вывода консоль (программа будет работать в черном окне), чтобы в коде было виднее логику программы / чтобы было проще программировать именно логику, а не обвязку взаимодействия с пользователем. ИМХО. В качестве примера - оконная программа с логикой (lab1). Кодес для Fasm, кодес не мой, возможно не компилируемый, но с комментариями. Также 2 примера для Masm, консольные, компилируемые. Надеюсь, все это окажется полезным.
Передать в аргументах процедуры? В командной строке программы? Как консольный ввод? В поле ввода в диалоговом окне? Под какую ОС должна быть программа?
invoke это макрос, самостоятельно компонующий аргументы в push'и, call это инструкция. Вот и вся разница. Строки принято передавать процедурам в виде указателей, символ тоже можно не морочиться и оформить как строку, вот так и сделай. Если строка находится в глобальных переменных (имеет фисированный или релоцируемый адрес), тупо передай ее метку (offset <label> в масмосинтаксисе вроде), если в локальных (в стекфрейме), то адрес получается инструкцией lea (в *x-синтаксисе фасма есть удобная директива addr для этого: invoke procedure,addr szStr1,addr szStr2, а как с этим в масме хз).
в масм32 директива addr сама определяет глобальная переменная или локальная, соответственно будет сгенерирована либо lea reg,szStr/push reg либо push offset szStr
alexandersivak, > В чём разница? Как сделать хорошо? Разница в том, что второй код нэйтив, архитектурный асм; первый же макрос - текстовый скрипт. Это используется для уменьшения количества текста.
Код (Text): lea esi, [var]; взятие адреса, 32-х разрядного в RadAsm [esi]; разыменование первого символа строки Здесь всё правильно понял?
Пока разбираюсь в режимах адресации - режим регистровой косвенной адресации. Мой код: Код (Text): sub edx,[esi] В дебаггере в Код (Text): edx записано значение 00680000, а в Код (Text): esi 00403125. Первое, как будет рассчитан результат? (Я просто вычел - не сошлось с результатом в дебаггере) Дополнительный вопрос. В дебаггере мой код выглядит иначе: Код (Text): sub edx,DWORD PTR ds: [esi] Зачем здесь Код (Text): DWORD PTR ds ?
Отвечу. По Edx и Esi, из Edx вычитается не Esi, а четырехбайтовое (Dword) значение, находящееся по адресу Ds:[Esi] Адресация относительно сегмента (селектора) DS: по умолчанию, поэтому в исходом тексте Вам это указывать не нужно, а дебаггер показывает, как оно на самом деле.
alexandersivak, IA https://software.intel.com/content/...-volumes-1-2a-2b-2c-2d-3a-3b-3c-3d-and-4.html Это эффективный адрес который приводится к линейному сложением с базой сегмента. 3.7.4: --- Сообщение объединено, 24 окт 2020 --- > Зачем здесь --> default segments.