Форум программистов, компьютерный форум, киберфорум
FASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/22: Рейтинг темы: голосов - 22, средняя оценка - 4.64
0x
0 / 0 / 0
Регистрация: 08.03.2013
Сообщений: 14

Работа с данными

08.03.2013, 20:49. Показов 4575. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пробую написать программу на фасме. Возникли вопросы, начну с первого:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
format PE console       
include 'FASM\include\win32ax.inc'
 
section '.data' data readable
    _mass dd 50 dup (0)
 
section '.code' code readable executable
main:
    mov eax, 12000000h
    mov ebx, 10h
    add eax, ebx
 
    mov [_mass], eax
    mov [_mass+4], eax
 
    invoke ExitProcess,0
.end main
Я хочу объявить массив в 50 элементов 4 байтовых значений, правильно ли я это делаю: _mass dd 50 dup (0) ?! Ну и соответственно записывать в него значения..
Просто когда я пытаюсь проверить таким образом:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
format PE console       
include 'FASM\include\win32ax.inc'
 
section '.data' data readable
    _mass dd 50 dup (0)
 
section '.code' code readable executable
main:
    mov eax, 12000000h
    mov ebx, 10h
    add eax, ebx
 
    mov ecx, [_mass]
    mov edx, [_mass+4]
 
    invoke ExitProcess,0
.end main
У меня в регистры записывает не 00 00 00 00, а другие значения. Поэтому делаю вывод, что что то не правильно делаю. Вопрос, что?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.03.2013, 20:49
Ответы с готовыми решениями:

Работа с файлами(Запись,чтение,работа с данными)
Здравствуйте, никак не могу осилить файлы... Для начала вот само задание: В справочной автовокзала хранится расписание движения автобусов....

Работа с битами И Работа с символьными данными
1. Ввести 8 символов. В символе с наибольшим кодом заменить 5-й бит единицей, а в символе с наименьшим кодом 6-й бит - нулем. Вывести...

Работа с данными
Помогите решить задачу: Напишите программу которая выдавала бы запрос на ввод кол-ва секунд в виде целого значения (используйте тип...

22
 Аватар для Troll_Face
608 / 406 / 8
Регистрация: 26.04.2012
Сообщений: 2,065
08.03.2013, 21:08
Вы все делаете верно, вот только точку входа не объявили и не указали импорт. у меня читаются нули
0
0x
0 / 0 / 0
Регистрация: 08.03.2013
Сообщений: 14
08.03.2013, 21:20  [ТС]
Цитата Сообщение от Fatal Error Посмотреть сообщение
Вы все делаете верно, вот только точку входа не объявили и не указали импорт. у меня читаются нули
Можно скрин ваш? может я не туда смотрю..
Что представляет собой точка входа? место с которого начинается выполнятся код программы?
А импорт что из себя представляет? он вроде в самом низу пишется, вроде пути разные, да? Насколько я понял, что если я подключаю win32ax.inc (а не win32a.inc), то его указывать не нужно?
0
 Аватар для Vadimych
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,045
08.03.2013, 21:24
Цитата Сообщение от 0x Посмотреть сообщение
может я не туда смотрю
А куда вообще смотрите? В ollydbg нули. Да и быть другого не может. С точкой входа у Вас всё нормально.
Assembler
1
2
main:
.end main
0
0x
0 / 0 / 0
Регистрация: 08.03.2013
Сообщений: 14
08.03.2013, 21:40  [ТС]
Ага, действительно выше всё верно. Я просто код немного упростил, думал ошибка именно в той строке, а выходит ошибка в другом.
Тогда вот такой вот пример, вот в нём то у меня непонятка и возникает:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
format PE console       
include 'FASM\include\win32ax.inc'
 
section '.data' data readable
    _mass dd 50 dup (0)
 
section '.code' code readable executable
main:
 
    proc Proverka uses eax ebx ecx edx, _mass
    mov eax, 12000000h
    mov ebx, 10h
    add eax, ebx
 
    mov ecx, [_mass]
    mov edx, [_mass+4]
    ret
    endp
    
    call Proverka
    invoke ExitProcess,0
.end main
т.е. я хочу определить функцию, в которую хочу передавать аргументы и изменять значения (в данном случае этого массива).

И сразу второй вопрос, можно ли выносить функцию таким образом? Код компилится, но вот в отладчике я не вижу этой функции (команд)... как увидеть?
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
format PE console       
include 'FASM\include\win32ax.inc'
 
section '.data' data readable
    _mass dd 50 dup (0)
 
section '.code' code readable executable
main:
    call Proverka
    invoke ExitProcess,0
.end main
 
    proc Proverka uses eax ebx ecx edx, _mass
    mov eax, 12000000h
    mov ebx, 10h
    add eax, ebx
 
    mov ecx, [_mass]
    mov edx, [_mass+4]
    ret
    endp
0
 Аватар для Vadimych
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,045
08.03.2013, 21:53
.end main поставьте после endp во втором варианте кода.
0
0x
0 / 0 / 0
Регистрация: 08.03.2013
Сообщений: 14
08.03.2013, 22:02  [ТС]
Цитата Сообщение от Vadimych Посмотреть сообщение
.end main поставьте после endp во втором варианте кода.
поставил, а просто выносить как я выше сделал, нельзя? по аналогии с с++ (функции отдельно все за main).
И с 00 00 00 00 что скажите? почему нету того же эффекта, в чем ошибка?
0
 Аватар для Vadimych
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,045
08.03.2013, 22:05
Цитата Сообщение от 0x Посмотреть сообщение
просто выносить как я выше сделал, нельзя?
Можно, но в экзешник код не попадёт. А что с нулями не так?
Или Вы про первый код? Тогда main: поставьте после endp.
0
0x
0 / 0 / 0
Регистрация: 08.03.2013
Сообщений: 14
08.03.2013, 22:07  [ТС]
Цитата Сообщение от Vadimych Посмотреть сообщение
Можно, но в экзешник код не попадёт. А что с нулями не так?
Гляньте в отладчике, теперь там в регистры не нули пишет, а нечто иное.
Вот скрин сделал...
Миниатюры
Работа с данными  
0
 Аватар для Vadimych
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,045
08.03.2013, 22:17
Вы же переменную в стеке расположили. Вот из него и пишет в регистры. Не понятно, почему ассемблер не ругается на переопределение переменной. Masm ругался бы.
0
0x
0 / 0 / 0
Регистрация: 08.03.2013
Сообщений: 14
08.03.2013, 22:20  [ТС]
Это как так? я вижу что из стека значения берутся, но почему не понял..
Я хочу передать переменную из секции дата и работать также как и в самом верхнем коде (как с простым массивом в памяти). Как мне это сделать?
0
 Аватар для Vadimych
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,045
08.03.2013, 22:24
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
format PE console       
include 'include\win32ax.inc'
 
section '.data' data readable
    _mass dd 50 dup (0)
 
section '.code' code readable executable
 
    proc Proverka uses eax ebx ecx edx, _mass
    mov eax, 12000000h
    mov ebx, 10h
    add eax, ebx
 
    mov eax, [_mass]
    mov ecx,[eax]
    mov edx,[eax+4]
    ret
    endp
    
main:
db 0cch
push _mass
    call Proverka
    invoke ExitProcess,0
 
.end main
1
0x
0 / 0 / 0
Регистрация: 08.03.2013
Сообщений: 14
08.03.2013, 22:48  [ТС]
Поясни строки, зачем положил в стек? почему нельзя просто в памяти? И что значит db 0cch (в отладчике int 3 прерывание пишет)?
Про db 0cch понял..

Добавлено через 18 минут
И почему
Assembler
1
2
3
    mov eax, [_mass]
    mov ecx,[eax]
    mov edx,[eax+4]
, а не
Assembler
1
2
    mov ecx,[_mass]
    mov edx,[_mass+4]
???
0
 Аватар для Vadimych
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,045
09.03.2013, 07:30
Цитата Сообщение от 0x Посмотреть сообщение
Про db 0cch понял
Это хорошо. Хотя я просто забыл убрать из кода отладочное прерывание. На остальные вопросы лучше всего ответит отладчик.
0
0x
0 / 0 / 0
Регистрация: 08.03.2013
Сообщений: 14
09.03.2013, 11:00  [ТС]
Насколько я понял, параметры в функцию передаются через стек адресами. Т.е. сначала в стек необходимо положить адрес ссылающийся на переменную, а в самой функции имя этой переменной будет ссылаться на место в стеке, где лежит этот адрес? и командой mov eax, [_mass] мы получаем адрес нашей переменной из стека? Вроде как то так получается..
0
 Аватар для Vadimych
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,045
09.03.2013, 12:39
Цитата Сообщение от 0x Посмотреть сообщение
Вроде как то так получается..
Совершенно верно.
1
0x
0 / 0 / 0
Регистрация: 08.03.2013
Сообщений: 14
09.03.2013, 17:46  [ТС]
Новый вопрос не заставил себя долго ждать: а как же мне можно изменять данные в этой переменной (массиве)?
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
format PE console       
include 'FASM\include\win32ax.inc'
 
section '.data' data readable
    _mass dd 50 dup (0)
 
section '.code' code readable executable
 
    proc Proverka uses eax ebx ecx edx, _mass
    mov eax, 12000000h
    mov ebx, 10h
    add eax, ebx
 
    mov ecx, [_mass]
    mov [ecx], eax
    ret 
    endp
    
main:
    push _mass
    call Proverka
    invoke ExitProcess,0
.end main
Таким образом не выходит... зависает..
Сразу еще один вопрос: у меня _mass глобально объявлен в секции дата? а есть ли смысл его передавать как переменную? ведь я его вижу таким образом:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
format PE console       
include 'FASM\include\win32ax.inc'
 
section '.data' data readable
    _mass dd 50 dup (0)
 
section '.code' code readable executable
 
    proc Proverka uses eax ebx ecx edx
    mov eax, 12000000h
    mov ebx, 10h
    add eax, ebx
 
;   mov ecx, [_mass]
    mov eax, [_mass]
    mov ebx, [_mass+4]
    ret 
    endp
    
main:
    ;push _mass
    call Proverka
    invoke ExitProcess,0
.end main
Добавлено через 3 часа 26 минут
Ну что? никто не знает?
0
 Аватар для Vadimych
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,045
09.03.2013, 17:50
0x, вот посмотрите в отладчике, что к чему.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
format PE gui
include 'include\win32ax.inc'
 
section '.code' code readable executable
 
    proc Proverka stdcall uses eax ebx ecx edx, _mass:DWORD
    local buffer[20]:BYTE
    local fmt[2]:DWORD
    
    mov [fmt],'%d, '
    mov [fmt+4],'%d'
 
    mov eax, [_mass]
    mov dword [eax],30
    mov dword [eax+4],100
    mov ecx,[eax]
    mov edx,[eax+4]
 
    lea esi,[buffer]
    lea edi,[fmt]
    invoke wsprintf,esi,edi,ecx,edx
    invoke MessageBox,0,esi,0,0
    ret
    endp
 
proc main
    local _mass[50]:DWORD
    
    lea eax,[_mass]
    push eax
    call Proverka
    invoke ExitProcess,0
    
endp 
.end main
0
0x
0 / 0 / 0
Регистрация: 08.03.2013
Сообщений: 14
09.03.2013, 18:52  [ТС]
Чёт я теперь совсем ничего не понимаю.. запутался. Можешь развернуто ответить на два вопросы выше? Я не понимаю происходящих там ошибок. Причину, почему так, а не эдак.
В твоем (давай на ТЫ, ок?) коде не вижу секцию data, зачем её убрал?

Не разу не видел такого объявления данных
Assembler
1
 local _mass[50]:DWORD
, можешь ссылку дать на описание? читаю faq по fasm, там написано "Директива "local" задает локальные имена, которые будут заменены уникальными значениями каждый раз, когда используется макроинструкция", а при чем тут вообще локальная метка? кажется извращением каким то такое применение для объявления массива данных..
0
 Аватар для Vadimych
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,045
09.03.2013, 19:04
Цитата Сообщение от 0x Посмотреть сообщение
Таким образом не выходит... зависает..
Сделайте секцию данных доступной для записи, не будет зависать.
Цитата Сообщение от 0x Посмотреть сообщение
каким то такое применение для объявления массива данных..
Не применяйте.
Цитата Сообщение от 0x Посмотреть сообщение
не вижу секцию data, зачем её убрал?
Чтобы был смысл в передаче параметра в другую процедуру.
Я все сведения по fasm черпаю из мануала. Сам я пишу на masm как правило.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.03.2013, 19:04
Помогаю со студенческими работами здесь

Работа с данными
Задание у меня такое: Создать базу данных пациентов, это я сделала, В одной из таблиц есть поля со списками степени выраженности симптомов...

Работа с данными
Реализовать функцию char ToUpper(char) которая переводит символ латинского алфавита в верхний регистр(перевод осуществлять именно для...

работа с данными
Ночь добрая. (php - новичок) делаю систему тестирования, есть страница добавления вопросов, есть страница вывода вопросов. На странице...

Работа с данными из БД
Доброго времени суток. Суть такая - из ячейки БД выгружаются данные, которые программой применяются в качестве пути для открытия...

Работа с данными
Составить массив данных о пациентах следующего содержания: Ф.И.О., год рождения, домашний адрес, наличие прививки: от туберкулеза, от...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru