|
11 / 10 / 2
Регистрация: 19.02.2018
Сообщений: 393
|
|||||||||||
MASM Длина строки, считанной из текстового файла10.06.2020, 22:12. Показов 3235. Ответов 13
Метки нет (Все метки)
Скажите, пожалуйста, правильно ли нахожу длину строки.
Если написать 2 символа получится 4, а если записать их в текстовый документ, что получится всего 2 байта. Использую masm32
так вроде работает
0
|
|||||||||||
| 10.06.2020, 22:12 | |
|
Ответы с готовыми решениями:
13
|
|
Модератор
|
|
| 11.06.2020, 14:19 | |
|
Егор Щербанов, поделитесь описанием решения проблемы - просто из одного кода неясна ни сама суть вопроса ни способ решения проблемы.
0
|
|
|
11 / 10 / 2
Регистрация: 19.02.2018
Сообщений: 393
|
||||||
| 11.06.2020, 15:17 [ТС] | ||||||
|
ФедосеевПавел, Хорошо, всё очень просто, открывается консоль, мы пишем текст, он записывается в текстовый файл, количество символов, которым мы ввели, равно количество байт записанных в файл.
Так всё работает, но с русскими символами получается какая-то абракадабра. Регистр ebx хранит строку, скажите, пожалуйста, как записать строку из регистра в переменную?
0
|
||||||
|
Модератор
|
|
| 11.06.2020, 16:06 | |
|
Регистр ebx не может хранить строку, т.к. размер ebx - всего 4 байта.
Судя по всему - строка находится в буфере/массиве buf. А значение ebx никто не обещал сохранять после вызова WinAPI.
0
|
|
|
11 / 10 / 2
Регистрация: 19.02.2018
Сообщений: 393
|
|
| 11.06.2020, 17:03 [ТС] | |
|
ФедосеевПавел, Простите пожалуйста, не так выразился, ebx содержит указатель на буфер строки, можно ли записать его в переменную?
0
|
|
|
780 / 412 / 75
Регистрация: 29.03.2013
Сообщений: 849
|
|||
| 11.06.2020, 17:15 | |||
1
|
|||
|
Модератор
|
|||||||||||||||||
| 11.06.2020, 18:04 | |||||||||||||||||
|
Особенность Windows в том, что по умолчанию для кириллицы используются разные кодировки в консольных и в GUI приложениях.
Перед записью перекодируйте в ANSI и тогда Блокнот откроет то, что вы набирали в консоли. Вот мой вариант чтения строки с консоли и сохранения её в файл. В строке 47 перекодировка. Ошибки, при открытии и записи в файл, обрабатываю библиотечной процедурой GetErrDescription из masm32 https://www.cyberforum.ru/post14452061.html Рекомендую и вам обрабатывать ошибки. Здесь ошибку можно воспроизвести если перед запуском программы открыть выходной файл каким-нибудь редактором или просмотровщиком, блокирующим совместную работу.
Argogo, согласен. Помню, что какие-то регистры сохранятся, а какие-то - не сохранятся. Помню, что столкнулся с особенностью invoke в masm - регистр eax используется для заполнения стека параметрами процедуры и поэтому, в eax не удастся корректно передать не крайний правый параметр
Конечно, если потребуется экономия на каждом байте кода, на каждом лишнем замедлении при обращении к памяти, то буду вынужден помнить и применять все соглашения. Добавлено через 7 минут Вот в ebx указатель на строку. Строка и так в памяти, в переменной буфера чтения. Если нужно скопировать из буфера в другую переменную, в другой буфер, то
0
|
|||||||||||||||||
|
11 / 10 / 2
Регистрация: 19.02.2018
Сообщений: 393
|
||||||
| 11.06.2020, 23:41 [ТС] | ||||||
|
Спасибо вам огромное за ваш ответ. Мне потребуется немного времени чтобы его досконально изучить.
Раньше программировал на python, там всё намного легче, но захотелось хардкора. Бросить вызов своему уму. Как мы прочитали файл, можно вывести в консоль с помощью функции printf ("str = %s\n", ebx). Никак не получается вывести в консоль.
0
|
||||||
|
Модератор
|
|||||||||||
| 11.06.2020, 23:51 | |||||||||||
|
Мне кажется, что неправильный порядок параметров ReadFile
В моей программе (отсюда)
0
|
|||||||||||
|
11 / 10 / 2
Регистрация: 19.02.2018
Сообщений: 393
|
||||||
| 12.06.2020, 00:06 [ТС] | ||||||
|
ФедосеевПавел,
Вы уделяете мне сколько своего времени, функция printf ("str = %s\n", ebx). Корректно всё выводит, А функция WriteConsoleA, нет, хотя ebx указывает на буфер обмена. Вот исходник
0
|
||||||
|
Модератор
|
||||||
| 12.06.2020, 00:49 | ||||||
Сообщение было отмечено Егор Щербанов как решение
Решение
Для вывода целых чисел - требуется преобразовать их в строку и строку выводить.
Скорее всего у вас ошибка в том, что перепутаны параметры. Я в своих тестовых программках использую переменные с именами, как в описаниях MSDN, поэтому труднее перепутать порядок.
1
|
||||||
|
11 / 10 / 2
Регистрация: 19.02.2018
Сообщений: 393
|
||||||
| 12.06.2020, 04:31 [ТС] | ||||||
Сообщение было отмечено ФедосеевПавел как решение
Решение
ФедосеевПавел, спасибо огромное за вашу помощь, вы мне очень помогли.
решил так.
0
|
||||||
|
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
|
|||
| 14.06.2020, 09:01 | |||
|
stdcall The stdcall[4] calling convention is a variation on the Pascal calling convention in which the callee is responsible for cleaning up the stack, but the parameters are pushed onto the stack in right-to-left order, as in the _cdecl calling convention. Registers EAX, ECX, and EDX are designated for use within the function. Return values are stored in the EAX register. stdcall is the standard calling convention for the Microsoft Win32 API and for Open Watcom C++. Добавлено через 9 минут Вот тут в MSDN https://docs.microsoft.com/ru-... ew=vs-2019 сказано: Компилятор создает код пролога и эпилога для сохранения и восстановления регистров ESI, EDI, EBX и EBP, если они используются в функции. и если на этой странице клацнуть на частный случай __stdcall то там будет Соглашение о вызовах __stdcall используется для вызова функций API Win32. Добавлено через 13 минут А, там уже Argogo об этом уже написал. Добавлено через 6 минут Пишу для Windows, использую Windows API, но реализациям функций Windows API не собираюсь доверять. Раздвоение личности какое-то.
0
|
|||
|
Модератор
|
|
| 14.06.2020, 10:39 | |
|
Да, так и есть. На память не помню, в справку смотреть лень.
Собственно, ошибка в программе была в путанице подстановки регистров в качестве аргументов при вызове функций WinAPI x32. Использование регистров вместо символьных имён переменных в исходниках было не оправдано, приводило к путанице. Если бы топикстартер внял этому - программа была бы исправлена на 5-6 часов раньше. И после этого, имея корректный исходник, можно его улучшать, заменяя переменные на регистры из списка сохраняемых при вызовах. Это я и хотел сказать, более - несколько раз повторил, привёл рабочие примеры. Можно придираться, что не помню соглашения о вызовах, но задача была в другом - убедить ТС проверять порядок подстановки параметров в вызов функции, и делать это на данном этапе учёбы было лучше через именованные переменные, а не регистры. IMHO, так правильное замечание замедлило работу на 5-6 часов.
0
|
|
| 14.06.2020, 10:39 | |
|
Помогаю со студенческими работами здесь
14
Считать N строк из текстового файла, причем неизвестна длина каждой строки
Напечатать все строки текстового файла, длина которых меньше заданного числа
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|