! 레이블 Vs 변수.


1.주소 Vs 메모리


-포인터:메모리에 대한 직접 접근이 가능

-변수를 선언해서 사용하지 않는다.

-메모리를 직접 사용한다


1). 주소


-메모리상의 위치

-파일 오프셋과 동일한 의미

-정수


2).메모리


-데이터가 들어있는 실제 메모리

-메모리를 나타낼려면 []를 사용해서 씌어주면 된다

-[apple] 이렇게면 주소에 해당하는 메모리 를 가지고온다 

-피 연산자가 메모리로 오는 경우에는 크기를 꼭 적어주어야 한다

ex)push dword [apple]




실습//진짜 중요// 개념을 확실히 하고 넘어가야한다


C언어 -> 어셈블리어 실습

주소와 메모리의 차이를 이해하고 넘어가야한다.



C코드

int a;

int b;


int main()

{

    scanf("%d",&a); ->주소

    scanf("%d",&b); ->주소


    printf("a:%d\n",a); ->메모리

    printf("b:%d\n",b); ->메모리


    return 0;

}


어셈블리 코드

extern printf

extern scanf


segment .data

string1 db 'a:%d',10,00

string2 db 'b:%d',10,00

avg db '%d %d',00


segment .bss

a resd  1

b resd  1



segment .text

global main



main:

        push b //주소 b 넣고

        push a // 주소 a 넣고

        push avg //주소 a b 입력받아서 넣을 string 문자 넣고

        call scanf // scanf 해준다


        push dword [a] //a주소에 있는 메모리값 가지고오고

        push string1 // 문자열 가지고오고

        call printf // 프린트해준다


        push dword [b] //b 주소에 있는 메모리값 가지고오고

        push string2//문자열 

        call printf// 프린트해준다





INTEL IA32 Architecture


-instruction set

-register


1.Register


CPU가 사용하는

-아주 빠른 기억장소

-고속의 기억 장치

-용도별로 여러개의 레지스터가 존재



1). 범용 레지스터:EAX, EBX, ECX, EDX (각각의 레지스터의 크기는 32bit)

EAX(Extended Accumulator Resgister) //사칙 계산 할때

EBX(Extended Base Resgister)

ECX(Extended Counter Resgister)//반복되는 횟수 (루프에서) 넣을때
EDX(Extended Data Resgister)

EBX,EDX-> 보조적인 형태로 사용

꼭 맞는 용도에서만 사용하는건 아니다. 쉽게 말하면 아무때나 사용이 가능하다


2). 포인터 레지스터:ESI, EDI, EBP, ESP, EIP ->레지스터 안에 값들을 전부 주소로 인식한다.


ESI(Extended Source Index)

EDI(Extended Dst. Index)


EBP(Extended Base Pointer)

ESP(Extended Stack Pointer)
EIP(Extended Instruction Pointer)

3). 플래그 레지스터:EFLAGS

-프로세스에 대한 상태 정보를 나타낸다.





4). 세그먼트 레지스터:CS, DS, SS, ES, ....(각각의 레지스터 크기는 16bit)



입출력이 빠르다

레지스터 >> 메모리(주 기억 장치 ) >> 보조 기억장치(디스크,USB,..)



크기를 잘 알아야 한다 



용량을 나누어 사용할 수 있는데 EAX는 32비트를 다 사용한다는 소리 이고 AX는 16비트를 사용한다는 소리인데 

AX는 또 AH,AL로 8비트씩 나누어 사용할 수 있다는걸 표현한다



! 앞으로 프로그램을 만들면서는 두가지의 기억장치를 사용해야 한다 (레지스터,메모리)



2. 명령어


1). 데이터 복사: MOV

ex)

-int a=1

-두 피연산자가 모두 메모리가 올 수 없다.


88 /r       MOV r/m8,r8 (첫번째 피연산자는 r레지스터/m메모리 둘중 하나가 올수 있다,두번째 피 연산자는  레지스터를 사용해야한다)

표를 보면 이런식으로 쭉 있는데 첫번째 두번째 연산자가 둘다 M 메모리가 올 수 없다.


imm-> 상수 표현법 




연습 


extern printf


segment         .data

prompt_int      '%d',10,00


segment         .bss


segment         .text


global main


main:


        mov  eax, 100   //첫번째 피연산자는 eax 레지스터 두번째 피연산자는 100 상수

        push eax //eax에 넣어주고 

        push prompt_int //문자열을 불러온다

        call printf //출력해준다






실습-위에서 했던 출력문을  a,b 가 바뀌어서 출력되도록 바꾸기


#> ./test

10

20

a: 10

b: 20



#> ./test

10

20

a:20

b:10



mov의 기본 설정을 이용해서 코딩을 해야하는데  mov는 메모리,메모리 롤 저장할 수 가 없다.

따라서 레지스터를 2개 이용해서 값을 저장하고 옮겨주어야 한다



extern printf

extern scanf


segment .data

string1 db 'a:%d',10,00

string2 db 'b:%d',10,00

input db '%d',00


segment .bss

a resd  1

b resd  1

c resd  1


segment .text

global main



main:

        push a

        push input

        call scanf


        push b

        push input

        call scanf


        mov ebx,dword [b]

        mov eax,dword [a]

        mov dword [b],eax

        mov dword [a],ebx


        push dword [a]

        push string1

        call printf


        push dword [b]

        push string2

        call printf






+ Recent posts