어셈블리

[어셈블리] 변수와 레지스터

우대비 2022. 8. 9. 10:01
반응형

[SASM 사용]

section .data
    ; 초기화된 데이터
    ; [변수이름] [크기] [초기값]
    ; [크기] db(1byte크기)[define byte],  dw(2byte)[word],  dd(4byte)[double],  dq(8byte)[quad]
    
   a db 0x11 
   b dw 0x2222
   c dd 0x33333333
   d dq 0x4444444444444444

위와 같은 방식으로 변수를 선언하고 값을 넣을 수 있음

Debug -> Show memory를 누르면 앞에서 선언한 변수를 살펴볼 수 있는데

보기 설정에서 12바이트씩 보이게하면 

 

a변수에서도 b, c, d 의 값을 볼 수 있음

 

 

rax에 a를 넣으면

0x11이 들어간게 아니라 0x403010이라는 이상한 값이 들어간걸 볼 수 있음

이 값을 주소값으로 검색을 해보면 a의 값이 나오는걸 확인 할 수 있음

이 주소값에 1을 더하면 a 다음에 만든 b의 값이 나옴

 

mov rax, a

위 코드는 a의 주소값을 rax에 넣는 코드임을 알 수 있음

그렇다면 a 안의 값을 넣으려면 어떻게 해야할까

 

mov rax, [a]

이렇게 하면 a안의 값을 rax에 넣을 수 있음

 

 

mov [a], [크기] [값]

위의 형식으로 다른 값을 넣을 수도 있는데

 

a의 크기보다 더 큰 값(0x6666)을 넣으면 바로 옆에있는 메모리공간에 침범해서 저장되는걸 볼 수 있음

 

        ; 메모리 <-> 레지스터
    ;mov rax, a ;a 라는 바구니의 주소값을 rax에 복사
    ;mov rax, [a] ; a 라는 바구니 안의 값을 rax에 복사 (디폴트 크기는 8byte)
    mov al, [a]
    
    mov [a], byte 0x55
    mov [a], word 0x6666
    mov [a], cl
    
    
    xor rax, rax        
    ret
    

    ; 변수의 선언 및 사용
    ; 변수는 그냥 데이터를 저장하는 바구니 [  ]
    ; - 처음에 바구니를 사용하겠다 선언 [이름과 크기를 지정]
 
    ; 메모리에는 구분할 수 있도록 주소(번지수)가 있다
 
    ; 초기화된 데이터
    ; [변수이름] [크기] [초기값]
    ; [크기] db(1byte크기)[define byte],  dw(2byte)[word],  dd(4byte)[double],  dq(8byte)[quad]
    
section .data

   a db 0x11 ; [0x11]
   b dw 0x2222
   c dd 0x33333333
   d dq 0x4444444444444444
   
   
section .bss   
   ; 초기화 되지 않은 데이터
   ; [변수이름] [크기] [개수]
   ; [크기] resb(1) resw(2) resd(4) resq(8)
  
    e resb 10

sectrion .bss는 초기화 되지 않은 데이터

 

즉 초기값을 넣지않은 변수는 bss에 들어간다고 함

반응형
LIST

'어셈블리' 카테고리의 다른 글

어셈블리 사칙연산  (0) 2022.08.10
엔디안  (0) 2022.08.09
[어셈블리] 레지스터 기초  (0) 2022.08.08
[어셈블리] Hello World  (0) 2022.08.08
SASM 설치  (0) 2022.08.08