조립-절차
어셈블리 언어 프로그램은 크기가 큰 경향이 있으므로 프로 시저 또는 서브 루틴은 어셈블리 언어에서 매우 중요합니다. 절차는 이름으로 식별됩니다. 이 이름 뒤에는 잘 정의 된 작업을 수행하는 절차의 본문이 설명됩니다. 프로 시저의 끝은 return 문으로 표시됩니다.
통사론
다음은 절차를 정의하는 구문입니다-
proc_name:
procedure body
...
ret
프로시 저는 CALL 명령어를 사용하여 다른 함수에서 호출됩니다. CALL 명령어는 아래와 같이 인자로 호출 된 프로 시저의 이름을 가져야합니다.
CALL proc_name
호출 된 프로시 저는 RET 명령어를 사용하여 호출 프로 시저에 제어를 반환합니다.
예
우리는 매우 간단한 절차라는 쓰자 합 ECX와 EDX에 저장되어있는 변수를 등록하고 EAX 레지스터 반환 합 추가 -
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov ecx,'4'
sub ecx, '0'
mov edx, '5'
sub edx, '0'
call sum ;call sum procedure
mov [res], eax
mov ecx, msg
mov edx, len
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov ecx, res
mov edx, 1
mov ebx, 1 ;file descriptor (stdout)
mov eax, 4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
sum:
mov eax, ecx
add eax, edx
add eax, '0'
ret
section .data
msg db "The sum is:", 0xA,0xD
len equ $- msg
segment .bss
res resb 1
위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.
The sum is:
9
스택 데이터 구조
스택은 스택의 '상단'이라는 위치에서 데이터를 저장하고 제거 할 수있는 메모리의 배열과 같은 데이터 구조입니다. 저장해야하는 데이터는 스택으로 '푸시'되고 검색 할 데이터는 스택에서 '팝업'됩니다. 스택은 LIFO 데이터 구조입니다. 즉, 처음 저장된 데이터가 마지막에 검색됩니다.
어셈블리 언어는 스택 작업에 대해 PUSH 및 POP의 두 가지 지침을 제공합니다. 이 명령어에는 다음과 같은 구문이 있습니다.
PUSH operand
POP address/register
스택 세그먼트에 예약 된 메모리 공간은 스택 구현에 사용됩니다. 레지스터 SS 및 ESP (또는 SP)는 스택 구현에 사용됩니다. 스택에 삽입 된 마지막 데이터 항목을 가리키는 스택의 맨 위는 SS : ESP 레지스터로 가리키며, 여기서 SS 레지스터는 스택 세그먼트의 시작을 가리키고 SP (또는 ESP)는 오프셋을 스택 세그먼트.
스택 구현에는 다음과 같은 특성이 있습니다.
뿐 words 또는 doublewords 바이트가 아닌 스택에 저장할 수 있습니다.
스택은 역방향, 즉 하위 메모리 주소로 증가합니다.
스택의 맨 위는 스택에 삽입 된 마지막 항목을 가리 킵니다. 삽입 된 마지막 단어의 하위 바이트를 가리 킵니다.
레지스터 값을 사용하기 전에 스택에 저장하는 것에 대해 논의했듯이; 다음과 같이 할 수 있습니다.
; Save the AX and BX registers in the stack
PUSH AX
PUSH BX
; Use the registers for other purpose
MOV AX, VALUE1
MOV BX, VALUE2
...
MOV VALUE1, AX
MOV VALUE2, BX
; Restore the original values
POP BX
POP AX
예
다음 프로그램은 전체 ASCII 문자 집합을 표시합니다. 기본 프로그램 은 ASCII 문자 세트를 표시하는 display 라는 프로 시저를 호출합니다 .
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
call display
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
display:
mov ecx, 256
next:
push ecx
mov eax, 4
mov ebx, 1
mov ecx, achar
mov edx, 1
int 80h
pop ecx
mov dx, [achar]
cmp byte [achar], 0dh
inc byte [achar]
loop next
ret
section .data
achar db '0'
위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.
0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}
...
...