어셈블리어

어셈블리어 : 프로그래밍 기초 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함수로 건너뛰기