어셈블리어
어셈블리어 : 프로그래밍 기초 1
잔망 루피
2023. 5. 17. 14:49
;mov eax, bx 레지스터 크기가 달라서 오류난다.
[섹션]
; .text 코드
; .data 초기화된 데이터
ㄴ 변수이름 크기지시자 초기값(db : 1byte dw:2byte dd:4byte dq:8byte)
ex) a db 0x1 = 1byte 크기 a변수선언 및 0x1로 초기화
;. bss 초기화 되지않은 데이터
ㄴ 변수이름 크기지시자(resb:1byte resw:2byte resd:4byte resq:8byte) 개수
;.reloc 메모리이미지 재배치
#이해
%include "io64.inc"
section .text
global CMAIN
CMAIN:
mov rbp, rsp; for correct debugging
mov al , [a] ; a 메모리주소에 있는 값을 al에 넣어라
PRINT_HEX 1, al
NEWLINE
mov eax , a ;이는 a주소를 eax 에 넣는 것이다.
PRINT_HEX 1 ,eax
NEWLINE
mov [a], byte 0x34 ; byte 0x34를 a 주소에 복사
PRINT_HEX 1 ,a
NEWLINE
ret
section .data
a db 0x1 ;1byte 크기(db) a 변수 0x1(값)로 초기화 [a]=값
;PRINT 쓸때는 그냥 a씀
# PRINT_STRING 의 사용
%include "io64.inc"
section .text
global CMAIN
CMAIN :
PRINT_STRING msg1
xor rax, rax
ret
section .data
msg1 db 'haha' , 0x00
#0x00은 문자종료를 나타내는 것으로 필수
#GET_DEC byte, al ; byte수만큼 al입력받겠다. DEC이니까 10진수로 받음
%include "io64.inc"
section .text
global CMAIN
CMAIN :
GET_DEC 1,al ;1byte
GET_HEX 2, a ; 2byte
PRINT_DEC 1, al
NEWLINE
PRINT_HEX 2, a
NEWLINE
xor rax, rax
ret
INPUT( 3, 4) OUTPUT( 3, 4 )
#add 사용 add a,b => a=a+b
%include "io64.inc"
section .text
global CMAIN
CMAIN :
mov ax,1
mov bx,3
add ax, bx
PRINT_DEC 1,ax
NEWLINE
mov [a], word 6
add ax,[a] ;
PRINT_DEC 2,a ; [a] 에 6이 들어가있
NEWLINE
mov bx ,2
add [a], bx
PRINT_DEC 2, a ;[a]에 bx 더하기
NEWLINE
xor rax, rax
ret
section .data
msg1 db 'haha' , 0x00 ;0x00은 문자종료를 나타내는 것으로 필수
section .bss
a resw 1 ;w니까 word 2byte
b resw 1
OUTPUT ( 4,6,8)
add [a],[b] 는 불가함 , 메모리끼리 연산이기때문
#MUL 의 사용
%include "io64.inc"
section .text
global CMAIN
CMAIN :
mov ax ,0
mov al, 2
mov bl, 3
mul bx
PRINT_DEC 1,ax
xor rax, rax
ret
mul para
- ax = al * para (1byte)
- ax = ax * para (2byte)
- eax = eax * para (4byte)
mul bx에서 bx 는 bl을 포함하고있으므로 3을 가지고있다. 1byte 레지스터이므로 al과 곱하고 ax에 저장
#div
%include "io64.inc"
section .text
global CMAIN
CMAIN :
mov ax, 7
mov bl, 2
div bl
mov bl,ah
PRINT_DEC 1,al
NEWLINE
PRINT_DEC 1,bl
NEWLINE
xor rax, rax
ret
div para = ax / para
- al(몫) , ah(나머지) ,1byte일때
- ax(몫) , dx(나머지), 2byte일때
- eax(몫), edx(나머지), 4byte 일때
위에서 ax / bl이니까 7/2 와같다. 몫은 al = 3 나머지는 ah = 1
#SHL SHR
%include "io64.inc"
section .text
global CMAIN
CMAIN :
mov ax, 0x1234
PRINT_HEX 2,ax
NEWLINE
shl ax,4
PRINT_HEX 2,ax
NEWLINE
mov [a], word 0x1234
PRINT_HEX 2,a
NEWLINE
xor rax, rax
ret
- SHL para1 , para2 : para1을 para2만큼 왼쪽으로 시프트 후 para1에 다시저장
- SHR para1, para2 : // 오른쪽 시프트
ax에 0x1234 값 저장
shl ax, 4 ax를 왼쪽으로 4칸 움직이고 다시 ax에 저장
#AND OR XOR NOT 연산
%include "io64.inc"
section .text
global CMAIN
CMAIN :
mov al, 0b10110110
mov bl, 0b01010101
PRINT_HEX 1, al //16진수로 b6
NEWLINE
PRINT_HEX 1, bl //16진수로 55
NEWLINE
and al,bl //and연산후al에 저장
PRINT_HEX 1,al //16진수로 14출력
NEWLINE
mov al, 0b10110110
not al //al 보수
PRINT_HEX 1,al
NEWLINE
xor rax, rax
ret
#test
%include "io64.inc"
section .text
global CMAIN
CMAIN :
mov ax, 0x1234
test ax, 0x0000
PRINT_HEX 2,ax
xor rax, rax
ret
test는 값을 비교해서 eflag에만 영향을 미칠뿐 값을 저장하지않는다
OUTPUT 1234 (mov함수 그대로)
C언어 -> 어셈블리언어
ax=20
bx=20
if (ax==bx){
cx=100;
}else cx=0;
printf(cx);
#CMP JE JMP ....
%include "io64.inc"
section .text
global CMAIN
CMAIN :
mov ax,20
mov bx,20
cmp ax,bx
je L_equal
mov cx,0
jmp L_equal_end
L_equal:
mov cx,100
L_equal_end:
PRINT_DEC 2,cx
NEWLINE
xor rax, rax
ret
어셈알고리즘은 하향 알고리즘 이해를 잘해야된다.
1. mov 로 값 저장
2. 조건분기문 쓸때는 cmp와 같이써야된다. des - src 형식으로 진행
3. 같다면 L_equal 로 점프 후 Print진행 , 아니라면 je 건너뛰고 cx 저장후 Print함수로 건너뛰기