Программирование на ASM

Krivych

Ословед
2Krivych
у Find какое соглашение вызова (stdcall, fastcall и т.д.?)

Сам лично не ставил, а по дефолту stdcall
Последний рабочий код был такой
Find PROTO :QWORD
.data
ReturnAddr qw Адресс
.code

Change proc
; mov rdi, [rax+444h] ; в проге тут хранится изначально "уровень"
push rcx; Указываем счетчик чтобы не трогать старые данные
lea rcx, [rax+444h]; адрес значения "уровня"
call Find; Вот здесь вызываем функцию, и передаем адрес значения
;mov rax, rcx; помещаем получившееся значение в rax
;от mov отказался call и так сохранял значение в rax
mov [rcx], rdi; востанавить значение после call т.к. там записывается найденное значния
pop rcx; возвращаем старое
jmp ReturnAddr; передаем управление дальше после хука
Change endp
end
решил уйти от call сделал немного иначе
Код:
.data
Table dq ...
ReturnAddr dq ...
.code
Change proc
    push rdx
    lea rdx, Table
    mov rax, [rdx+rdi*8]
    pop rdx
    jmp ReturnAddr
Change endp
end
упращенно в несколько раз, тока вот заметил, что как только стоит переключится на свою таблицу то некотрые параметр обнуляются хотя я просто меняю размерность слова но при этом прога работает дальше нормально
 

Вадька

Ословед
Есть какая-нибудь книга или статья про использование 32-битных регистров?
 

Bob

Ословед
Есть какая-нибудь книга или статья про использование 32-битных регистров?

А что конкретно ты хочешь узнать ? Помоему в любой книжке по асму объясняется как пользоваться регистрами. Куда же без них ? :)
Например вот хороший материал:
[doc]wasm-offline-08-10-2007.zip 23.30 Мб 49.[152-155]
 

Вадька

Ословед
Нужно использовать этот код
Код:
StrToNum: 
		push 	esi 			;сохраняем указатель в стеке 
		mov	ecx,10
		xor 	eax,eax 		;ЕАХ = О 
		xor 	ebx,ebx		;ЕВХ = О: накопитель для числа 
next: 
		lodsb 				;читаем цифру в AL 
		cmp 	al,20h			;пробел? 			
		jz 	done 
		sub	al,'0'			;преобразовать в число и сохранить его в AL 
		imul 	ebx,ecx 		;умножить ЕВХ на ЕСХ, сохранить в ЕВХ
		add 	ebx,eax 		;сложить 
		jmp 	short next 		;и повторить 
done: 			
		xchg 	ebx,eax 		;поместить накопленное число в ЕАХ 
		pop 	esi 			;восстановить исходное значение ESI 
;-------------------------------------------------------------------
А значит в начале нужна деректива .386. В итоге прога после запуска сразу завершается, а без него работает нормально.
 

Bob

Ословед
Нужно использовать этот код
Код:
StrToNum: 
		push 	esi 			;сохраняем указатель в стеке 
		mov	ecx,10
		xor 	eax,eax 		;ЕАХ = О 
		xor 	ebx,ebx		;ЕВХ = О: накопитель для числа 
next: 
		lodsb 				;читаем цифру в AL 
		cmp 	al,20h			;пробел? 			
		jz 	done 
		sub	al,'0'			;преобразовать в число и сохранить его в AL 
		imul 	ebx,ecx 		;умножить ЕВХ на ЕСХ, сохранить в ЕВХ
		add 	ebx,eax 		;сложить 
		jmp 	short next 		;и повторить 
done: 			
		xchg 	ebx,eax 		;поместить накопленное число в ЕАХ 
		pop 	esi 			;восстановить исходное значение ESI 
;-------------------------------------------------------------------
А значит в начале нужна деректива .386. В итоге прога после запуска сразу завершается, а без него работает нормально.

Если до начала выполнения этого кода, адрес твоей строки заносится в регистр ESI корректно, то этот код под .386 будет выполняться гарантированно. (Кстати перед "next:" не мешало бы поставить "cld").
Ты пишешь, что с директивой .386 прога сразу завершается. Значит конфликт где-то выше, но не в этом коде.
Давай всю прогу посмотрим.
PS. Отладчиком не пользуешься что-ли ?
 

    Вадька

    очки: 0
    Нет комментариев

Eskat0n

Ословед
Ввиду того, что с приближением сессии начинается шевеление на одной известной специальности по сдаче курсового ПАН'у желающие могут написать в ПС и получить листинг курсового под один из вариантов (далее большого ума не надо, чтобы доработать).
Что-то на меня альтруизм напал.
Алсо, не оффтоп.
 
вот начал изучать АСМ.
какой компилятор выбрать? есть вообще IDE для асма?
 

Bob

Ословед
вот начал изучать АСМ.
какой компилятор выбрать? есть вообще IDE для асма?

1. Ассемблер: MASM32 v.10 (www.masm32.com)
MASM32_v10.zip 3.76 Мб 49.[152-155]


2. Очень продвинутая IDE: RadAsm 2.2.1.5 (www.radasm.com)
сначала установить этот файл:
RadASM_2.2.1.5 881.01 Кб 49.[152-155]
а потом этот:
RadASM_Assembly_programming_pack(07.08.2008) 942.61 Кб 49.[152-155]


3. Очень хороший сайт по программированию на асме: (www.wasm.ru)
есть и offline-версия этого сайта, правда не свежая
Offline-версия_форума_WASM.RU.chm 9.69 Мб 49.[152-155]
 
* написал(а):
3. Очень хороший сайт по программированию на асме: (www.wasm.ru)
есть и offline-версия этого сайта, правда не свежая
Offline-версия_форума_WASM.RU.chm 9.69 Мб 49.[152-155]
RadAsm создает html файлы почему-то:idontno:
я правда в изучении еще не скоро до примеров дойду, но сам факт..
как там вообще прогу то компилить? делаю make-run, он мне в ИЕ файл открывает(это я не проект создавал, а файл просто). короче, мне надо хелп по RadAms'у:spiteful:
 

Bob

Ословед
RadAsm создает html файлы почему-то:idontno:
я правда в изучении еще не скоро до примеров дойду, но сам факт..
как там вообще прогу то компилить? делаю make-run, он мне в ИЕ файл открывает(это я не проект создавал, а файл просто). короче, мне надо хелп по RadAms'у:spiteful:

Agent, я ж тебе написал - установить RadAsm, потом Assembly language pack. В Assembly language pack есть файл readme.txt, там написано:
Unzip to RadASM root (C:\RadASM) so that fasm.ini, Goasm:ini,
masm.ini, nasm.ini and tasm.ini are in the same directory as
RadASM.exe and RadASM.ini.
Then use Options / Programming Languages to add the languages.

Короче, скопировал содержимое архива в директорий с радасмом, запустил радасм, вошел в Options/ Programming Languages и добавил masm или что хочешь еще.
Естественно masm32 уже должен быть предварительно тобой установлен.
 

    agent

    очки: 16
    bonus
задали такое задание: как из машинной команды получить команду, записанную на мнемокоде?
дано:8B 1E 12 02
получить:MOV BX, [0212]
в методичке много чего написано(начало на скрине), но ничего не понятно(
просьба объяснить как получить код операции, как узнать способ адресации, и регистр, указынный в команде
это не единственное задание, но думаю что с остальным сам разберусь
 

Alexandr172

Ословед
задали такое задание: как из машинной команды получить команду, записанную на мнемокоде?
дано:8B 1E 12 02
получить:MOV BX, [0212]
в методичке много чего написано(начало на скрине), но ничего не понятно(
просьба объяснить как получить код операции, как узнать способ адресации, и регистр, указынный в команде
это не единственное задание, но думаю что с остальным сам разберусь

Из этой же методички, используя приложение D, таблицу 3 и 6, получим искомое.
 

    agent

    очки: 18
    +500

gureedo

Самец :)
задали такое задание: как из машинной команды получить команду, записанную на мнемокоде?
дано:8B 1E 12 02
получить:MOV BX, [0212]
в методичке много чего написано(начало на скрине), но ничего не понятно(
просьба объяснить как получить код операции, как узнать способ адресации, и регистр, указынный в команде
это не единственное задание, но думаю что с остальным сам разберусь

к примеру, скачать книжку Assembler (В. Юров).djvu и почитать ее.

еще можно погуглить опенсорс дизассемблер.

з.ы. кто автор методички?
 
"Почитать" - несколько не то слово. "Посмотреть". Кроме как в качестве справочника сия книга не годится.
 
есть задание, к нему дополнение:
программа должна занимать две разрывные области в адресном пространстве в двух сегментах кода, межсегментный разрыв должен быть в теле основного цикла.

как сделать межсегментный разрыв?
внтурисегментный то легко, jmp смещение;
а вот такой как сделать не знаю
 

Alexandr172

Ословед
есть задание, к нему дополнение:
программа должна занимать две разрывные области в адресном пространстве в двух сегментах кода, межсегментный разрыв должен быть в теле основного цикла.

как сделать межсегментный разрыв?
внтурисегментный то легко, jmp смещение;
а вот такой как сделать не знаю

Опять смотрим ту же методичку... рис.5 (формирование адресов перехода) и приложение D (команда JMP)
 
Д

Другая

Срочно нужно выполнить контрольную из 8 заданий. Задания должны быть выполнены на ассемблере и на С++. Кто делает или знает где могут сделать напишите пжл!
 
Сверху