Compare commits
	
		
			No commits in common. "fd4c26850bc87ebea3ccd14a44dd1eb4a35d7e42" and "f5a87e3e0a3ada2384ef5ef0313dd7a71632df6c" have entirely different histories.
		
	
	
		
			fd4c26850b
			...
			f5a87e3e0a
		
	
		
					 1 changed files with 0 additions and 85 deletions
				
			
		|  | @ -1,85 +0,0 @@ | ||||||
| # A |  | ||||||
| 
 |  | ||||||
| * Есть стандартная библиотека, с которой это будет слинковано |  | ||||||
| * return 0 |  | ||||||
| * Очистить стек |  | ||||||
| *  |  | ||||||
| 
 |  | ||||||
| # Notices |  | ||||||
| 
 |  | ||||||
| ## X86 |  | ||||||
| 
 |  | ||||||
| * cmovXX (перемещение с условием) |  | ||||||
| * setXX (установка бита с условием) |  | ||||||
| * Аргументы через стек в обратном порядке |  | ||||||
| * Удаление из стека лежит на вызывающем |  | ||||||
| * Результат работы - в al, ax, eax (стандартные типы) |  | ||||||
| * Дробные - в регистрах сопроцессора |  | ||||||
| * cdecl (декларация языка Си)   |  | ||||||
| * push/pop - стек |  | ||||||
| * base pointer - для доступа к локальным переменным |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| printf(str, x, y) |  | ||||||
| --- |  | ||||||
| push dword [y] |  | ||||||
| push dword [x] |  | ||||||
| push str |  | ||||||
| call printf |  | ||||||
| -> push L1 |  | ||||||
| jmp printf |  | ||||||
| --- |  | ||||||
| after call: |  | ||||||
| L1: add esp, 12 ; 3 * 4  |  | ||||||
| --- |  | ||||||
| result in eax register (number of printed arguments) |  | ||||||
| ``` |  | ||||||
| * В стек помещается сначала адрес возврата (адрес, откуда вызвали, плюс длина данной инструкции)    |  | ||||||
| * ret -> pop ???; jmp ??? |  | ||||||
| * envp, argv, argc - заталкиваются в стек до функции main и ее аргументов |  | ||||||
| * str db, dw, dd, dq (define byte/word/double word) = 12,14,0 (или 'ABCDE', 13, 0), 13 - новая строка, 0 - нулевой байт |  | ||||||
| * x resb(w/d/q) 1 |  | ||||||
| * В глобальных переменных - нуль (по умолчанию) |  | ||||||
| * section (segment - устар.)  |  | ||||||
| ``` |  | ||||||
| 	.text (код) |  | ||||||
| 	.data (иниц. данные) |  | ||||||
| 	.rdata (константы) |  | ||||||
| 	.bss (неиниц. данные) |  | ||||||
| ``` |  | ||||||
| * .bss хранится в виде размера (выделяется в момент запуска) |  | ||||||
| ``` |  | ||||||
| 	section .text |  | ||||||
| 		push |  | ||||||
| 		push |  | ||||||
| 		call |  | ||||||
| 	section .data |  | ||||||
| 		str db '%d',0 |  | ||||||
| 	section .bss |  | ||||||
| 		x resd 1 |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| * global (например, main) |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| global main |  | ||||||
| ``` |  | ||||||
| * Добавляет подчеркивания к меткам, _main, например (M$ only) |  | ||||||
| * Вместо линковки вызываем gcc (gcc знает, где стандартная библиотека) |  | ||||||
| * Конвенция fastcall (часть аргументов через регистры, 6 регистров для Linux, в прямом порядке, прочее - в стек в обратном) |  | ||||||
| * Выравнивание стека для x86_64 |  | ||||||
| * Стандартный эпилог и пролог: |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| 	push ebp |  | ||||||
| 	mov ebp, esp |  | ||||||
| 	... |  | ||||||
| 	mov edx, [ebp + 8] ; адрес через 2 байта от вершины стека |  | ||||||
| 	... |  | ||||||
| 	mov esp, ebp ; восстанавливаем для функции, вызвавшей данную |  | ||||||
| 	pop ebp |  | ||||||
| 	ret |  | ||||||
| ``` |  | ||||||
| * ebp указывает на вершину стека |  | ||||||
| * Пролог, эпилог почти обязателен |  | ||||||
| * sub esp, 32 - для локальных переменных (ebp остался), размер всех локальных переменных функции, обращение к локальным переменным - с минусом от ebp |  | ||||||
		Reference in a new issue