Page 67 of 77

Re: Помогите новичку

Posted: Fri Mar 13, 2015 8:43 am
by gc986
Gluk wrote:Хотя раз уж мы добавили,

Code: Select all

cmp   eax, 0
то для однообразия может лучше и сменить всё на cmp
Теперь всё понятно :D У вас получится очень понятный учебник :)

Сейчас осваиваю циклы и операторы выбора и встал вопрос объявления переменных. Я делаю так чтобы объявить целочисленные переменные:

Code: Select all

DATA
i_1 byte 986
; или так
i_2 db 991
И ещё несколько подобных вариантов, компилятор мне всегда говорит - неправильная инструкция. Как правильно объявлять переменные?

Re: Помогите новичку

Posted: Fri Mar 13, 2015 1:01 pm
by gc986
Вроде азобрался с задачей переменных. Теперь пытаюсь их сравнить:

Code: Select all

...
cmp i_1, i_2
   jne mcall -1
   jmp wait_event

...
DATA
i_1 dd 986d
i_2 dd 991d
Система говорит неправильные опернды. Какие тонкости сравнения я не учёл?

Re: Помогите новичку

Posted: Fri Mar 13, 2015 1:52 pm
by gc986
gc986 wrote:Вроде азобрался с задачей переменных. Теперь пытаюсь их сравнить:

Code: Select all

...
cmp i_1, i_2
   jne mcall -1
   jmp wait_event

...
DATA
i_1 dd 986d
i_2 dd 991d
Система говорит неправильные опернды. Какие тонкости сравнения я не учёл?
Вроде разобрался, как я понимаю, нельзя сравнивать две переменные, нужно сравнивать переменную с регистром. По собственным офущениям на писал следующую вещь:

Code: Select all

mov eax, [i_2]
cmp [i_1], eax
jne close_program
jmp wait_event
И тут у меня созрел один вопрос который уже давно мне не давал покоя время от времени всплывая в памяти - есть регистры процессоров, по какому принципу я могу их использовать и нужно ли мне опасаться того что в них может что-то находится из-за чего программа дальше не полетит?

Re: Помогите новичку

Posted: Fri Mar 13, 2015 3:32 pm
by e-andrew
Используй регистры смело. Мало того, старайся использовать только регистры для временной информации (например, для счетчика цикла, или для результата вычисления. Или если тебе нужно получить размер экрана, но использовать его нужно только сейчас). НО! Передача параметров системным функциям происходит через регистры, поэтому следи за тем, чтобы при вызове системной функции в регистрах были нужные значения.

Re: Помогите новичку

Posted: Wed Mar 18, 2015 9:11 am
by gc986
Три дня мучаюсь, не могу сделать чтобы кнопка закрывалась по десятому нажатию на неё X( ! Ребята выручайте!

Re: Помогите новичку

Posted: Wed Mar 18, 2015 10:26 am
by Gluk
А вы пользуетесь отладчиком?

Re: Помогите новичку

Posted: Thu Mar 19, 2015 9:11 am
by gc986
Gluk wrote:А вы пользуетесь отладчиком?
Честно говоря, не дошёл до него ещё, сначала думал с элементарными вещами разобраться (циклы, выбор, присваивание). Ране не приходилось пользоваться отладчиком из командной строки.

Нашёл этот архив с документацией за 2010 год, по идее всё должно совпадать с современной версией - download/file.php?id=1932

Re: Помогите новичку

Posted: Thu Mar 19, 2015 12:31 pm
by gc986
Gluk wrote:А вы пользуетесь отладчиком?
Странно. Запустил под отладчиком. Данные аккумулируются в переменной, [button2], но у меня её нет в тексте программы. В отладчике вроде всё правильно - происходит аккумуляция, а далее ожидание события, требуется нажать на кнопку, Но когда программа работает нормально, я один раз нажимаю (видимо происходит цикл) и программа заканчивается.

Re: Помогите новичку

Posted: Thu Mar 19, 2015 4:07 pm
by Gluk
он очень упрощает разработку, рекомендую разобраться! Вы будете видеть состояние каждого регистра и ячейки памяти при пошаговом выполнении программы, так что и с элементарными вещами разобраться будет гораздо проще - на практике

[набрал это сообщение, не видя предыдущего, извиняюсь]

Re: Помогите новичку

Posted: Thu Mar 19, 2015 7:19 pm
by Leency
Не получается нормально сохранить данные. Функция 70, подфункция 3: Запись в существующий файл с поддержкой длинных имён.

Code: Select all

f70 write_file_offset_70; 
int WriteFileWithOffset(dword write_data_size, write_buffer, write_file_path, offset)
{
	write_file_offset_70.func = 3;
	write_file_offset_70.param1 = offset;
	write_file_offset_70.param2 = 0;
	write_file_offset_70.param3 = write_data_size;
	write_file_offset_70.param3 = write_buffer;
	write_file_offset_70.param4 = 0;
	write_file_offset_70.name = write_file_path;
	$mov eax,70
	$mov ebx,#write_file_offset_70.func
	$int 0x40
}  

Code: Select all

WriteFile(9, "BMP", "/tmp0/1/1.bmp"); //записывает как надо
WriteFileWithOffset(3, "OLO", "/tmp0/1/1.bmp", 3); //пишет мусор
WriteFileWithOffset(3, "PSH", "/tmp0/1/1.bmp", 6); //пишет мусор
Моя ошибка или ошибка в ядре?

Re: Помогите новичку

Posted: Fri Mar 20, 2015 2:03 pm
by Yason
gc986 wrote:
Gluk wrote:А вы пользуетесь отладчиком?
Странно. Запустил под отладчиком. Данные аккумулируются в переменной, [button2], но у меня её нет в тексте программы. В отладчике вроде всё правильно - происходит аккумуляция, а далее ожидание события, требуется нажать на кнопку, Но когда программа работает нормально, я один раз нажимаю (видимо происходит цикл) и программа заканчивается.
Держи исправленый вариант. Программа отображает число нажатий на кнопку, и завершается, если на кнопку снизу, нажать 10 раз.

Re: Помогите новичку

Posted: Fri Mar 20, 2015 4:17 pm
by Yason
Leency wrote:Не получается нормально сохранить данные. Функция 70, подфункция 3: Запись в существующий файл с поддержкой длинных имён.

Code: Select all

f70 write_file_offset_70; 
int WriteFileWithOffset(dword write_data_size, write_buffer, write_file_path, offset)
{
	write_file_offset_70.func = 3;
	write_file_offset_70.param1 = offset;
	write_file_offset_70.param2 = 0;
	write_file_offset_70.param3 = write_data_size;
	write_file_offset_70.param3 = write_buffer;
	write_file_offset_70.param4 = 0;
	write_file_offset_70.name = write_file_path;
	$mov eax,70
	$mov ebx,#write_file_offset_70.func
	$int 0x40
}  

Code: Select all

WriteFile(9, "BMP", "/tmp0/1/1.bmp"); //записывает как надо
WriteFileWithOffset(3, "OLO", "/tmp0/1/1.bmp", 3); //пишет мусор
WriteFileWithOffset(3, "PSH", "/tmp0/1/1.bmp", 6); //пишет мусор
Моя ошибка или ошибка в ядре?
Наверно твоя! :? У меня всё работает! (FASM) :mrgreen:

Re: Помогите новичку

Posted: Fri Mar 20, 2015 4:28 pm
by Leency
FFUUUUU!!

Можешь код показать?

Re: Помогите новичку

Posted: Fri Mar 20, 2015 4:56 pm
by CleverMouse

Code: Select all

   write_file_offset_70.param3 = write_data_size;
   write_file_offset_70.param3 = write_buffer;
?

Re: Помогите новичку

Posted: Fri Mar 20, 2015 5:11 pm
by Leency
NOOOOOO!!!!...

CleverMouse, ты как всегда лучше всех, спасибо.