Compare commits
	
		
			3 commits
		
	
	
		
			f5a87e3e0a
			...
			fd4c26850b
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | fd4c26850b | ||
|  | eeb7752c6d | ||
|  | 1c59c1d541 | 
					 1 changed files with 85 additions and 0 deletions
				
			
		
							
								
								
									
										85
									
								
								nasm/notices.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								nasm/notices.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,85 @@ | ||||||
|  | # 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