조립-절차

어셈블리 언어 프로그램은 크기가 큰 경향이 있으므로 프로 시저 또는 서브 루틴은 어셈블리 언어에서 매우 중요합니다. 절차는 이름으로 식별됩니다. 이 이름 뒤에는 잘 정의 된 작업을 수행하는 절차의 본문이 설명됩니다. 프로 시저의 끝은 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{|}
...
...