본문 바로가기

바이러스개발을위한어셈블리어

어셈블리어로 사칙연산하기

하하 어셈블리어는 정말 깐깐한 언어인것 같다. 연산 방식도 하나하나 지정해줘야 하고 변수 정의할 때 레지스터 위치도 하나하나 지정해줘야 하는등 정말 태초적인 언어인것 같다. 파이썬은 밀키트 하는 느낌이라면 이건 재료를 하나하나 마트에서 사서 차근차근 조리 순서에 맞춰 조리하는 내가 직접 손수 만드는 가내수공업 같달까...?

 

 그래서 어쨌든 오늘 어셈블리어로 사칙연산하는 코드를 게시할 것이다.

일단 사칙연산을 하기 전에 변수를 지정하고 변수 값을 출력하는 코드를 써보자.

 

%include "io64.inc"
section .data


section .bss
    a resw 1
    
section .text
global CMAIN
CMAIN:
    
    GET_DEC 2, [a]
    NEWLINE
    PRINT_DEC 2,[a]
    
    xor rax, rax
    ret

a변수를 지정할 1byte크기를 레지스터에 지정을 한다.

2byte짜리 10진수를 받고, 받은 2byte짜리 10진수를 출력한다.

처음에는 a변수를 1byte크기로 지정하는줄 알았는데 전혀 아니었다. 헷갈릴수 있으니 주의하길 바란다.

 

2. 더하기

%include "io64.inc"

section .data
a dw 0  ;dw-기억공간 차지
b dw 0

section .text
global CMAIN
CMAIN:
 
    mov eax, 0
    GET_DEC 2, [a] ;2바이트 크기의 10진수 받아옴.
    GET_DEC 2, [b]
    
    mov eax, [b]
    imul eax, 2 ;2를 곱함
    add eax, [a] ;a를 더함
    PRINT_DEC 2, eax ;최종값을 출력함
    
    xor rax, rax
    ret

*여기에서 사용한 dw와 resw의 차이를 말하자면 resw는 메모리 공간만 정의를 한 경우이고 dw는 메모리 공간과 초기값을 지정하는데 사용된다. 

데이터 지시어: 데이터 세그먼트에서 메모리 공간 지정할때 사용하는 명령어. 

두가지 방법이 있는데 하나는 메모리 공간만 정의하는 resx계열 명령어가 있고 다른 하나는 메모리 공간과 초기값을 지정하는 dx계열 명령어가 있다. 

문자(Letter)       dx resx 단위(Unit) another name
b       db resb 1바이트 바이트(byte)
w       dw resw 2바이트 워드(word)
d       dd resd 4바이트 더블 워드(double word, dword)
q       dq resq 8바이트 쿼드 워드(quard word, qword)
t       dt rest 10바이트 텐 바이트(ten byte, tbyte)

*점점 수정해나갈 예정이다. 하하하

'바이러스개발을위한어셈블리어' 카테고리의 다른 글

어셈블리어 문법  (0) 2022.04.18
칼리리눅스 어셈블리어 코드 작성  (0) 2022.04.17
어셈블리어 기본  (0) 2021.12.26