태초의 프로그래밍 언어 어셈블리

assembly, 8086, x86

mov 명령어

이제서야 실습을 하게 되었습니다. 16진수, 2진수와 8086 구조에 대한 글을 보면서 하나도 모르겠다고 생각하셔도 전혀 상관없습니다. 원래 처음 뭔가를 배운다는게 내가 뭘 모르는지 모르는 상태에서 뭘 모르는지 아는 상태로 옮겨가는 거라고 합니다. 이제 "16진수, 2진수, 8086의 구조에 대해서 모르겠다"라는 것을 아신 것입니다. 그러니 진일보한 것이지요.

실습을 하면 16진수,2진수,레지스터들에 대해서 좀더 이해해보겠습니다.

일단 emu8086의 압축을 풀었던 디렉토리를 열어봅니다. emu8086.exe 파일이 보이지만 지금은 emu8086.exe가 아니라 cmdhere.cmd 파일을 실행합니다. 그러면 터미널 창이 나타납니다. 아마 터미널을 처음 보신 분들도 계실것 같습니다. 당황하지않고 notepad라고 키보드로 칩니다. 그리고 엔터를 치면 메모장이 실행될 것입니다. 메모장에 실습할 어셈블리 명령어들을 입력합니다.

mov ax, 1000

mov bx, 1000h

mov cx, 0ffffh

 

그리고 파일을 저장합니다. 이름은 상관없지만 키보드로 입력하기 편하게 mov.txt로 하겠습니다. 그리고 다시 터미널에 들어가서 emu8086.exe mov.txt 라고 입력합니다. 그럼 emu8086이 실행되면서 텍스트 편집기에 우리의 예제 소스가 나타납니다. 바로 emulate 메뉴를 실행합니다.

일부러 화면을 캡처하지 않겠습니다. 한번 해보세요. 에물레이터 화면을 보면 왼쪽에 레지스터 값이 나타나고 오른쪽에는 메모리 값과 메모리에 있는 어셈블리 명령어가 나타납니다. 우리가 입력한 mov ax, 1000이 있나요? 아마 없을 겁니다. mov bx, 1000h는 있나요? 있습니다. 무슨 차이일까요?

이전 글에서 프로세서는 2진수만 알 수 있고 어셈블리 명령에서는 2진수를 보기쉽게 만드는 16진수만을 쓴다고 말씀드렸습니다. 바로 지금 우리가 입력한 10진수가 16진수로 어셈블링되서 프로세서에 저장된 것을 볼 수 있습니다. 10진수 1000이 16진수로 3e8h입니다. 그래서 명령어 화면에 mov ax, 3e8h로 나타난 것입니다. 1000h는 16진수이므로 명령어 화면에 그대로 mov bx, 1000h로 나타납니다. 0ffffh도 마찬가지로 그대로 나타나구요.

그리고 single step 버튼을 눌러보세요. 레지스터 값이 바뀌나요? step back 버튼도 눌러보세요. 그리고 다른 버튼들도 눌러서 어떻게 실행되나 해보세요.

어셈블리 명령이 뭔지 레지스터에 어떻게 값을 쓰는지 알것 같으신가요? 이렇게 레지스터에 직접적으로 값을 쓰는 명령어가 mov입니다.

레지스터에 데이터를 써놨는데요 이번에는 다른걸 해보시기 바랍니다. 레지스터의 값을 다른 레지스터로 옮기는건 어떻게 하면 될까요?

그리고 CS, IP, SS, SP 등등 범용 레지스터가 아닌 특수한 레지스터들에 값을 한번 써보세요. 특수한 레지스터와 범용 레지스터간에 값을 옮겨보세요.

 

댓글

댓글 본문
작성자
비밀번호
  1. starlee3
    risc 계열 cpu에서

    add $r8,$zero,$r10 ($zero 레지스터와 $r10 ALU연산후 값을 $r8 레지스터에 저장) 또는

    addi $r8,$zero,100 할경우 ($zero 레지스터와 값 100을 ALU연산후 값을 $r8 레지스터에 저장)
    하는데
    risc은 이해가 쉽게 가는데요!!!


    보통 x86 계열에서

    mov eax, ecx 하면 간단히 ecx->eax 전송명령인데요
    mov eax, 333 하면 간단히 333->eax 전송명령인데 !!!!!!!!!

    mov 명령은 ALU와 관련된 명령어라고함(FLAG에 영향을 미침)
    -----------------------------------------------------------


    operand ecx와 쌍이 되는 오퍼랜드(레지스터?)는 없는지요?
    333 즉치값이랑 쌍이 되는 오퍼랜드(레지스터?)는 없는지요?


    즉 ecx+0= eax가 된다는 말인데
    333+0= eax 가 된다는 말인데 ?? 도대체 risc처럼 항상 $r0 레지스터에 값이 0인 레지스터가 있나요???
    아니면 ALU 한쪽 입구에 mux로 0를 입력해주나요??
  2. TeacherK
    천천히 감을 잡을 생각입니다...고맙습니다...
  3. 참치통조림
    좋은 강의 감사합니다.
  4. gurugio
    남시병교수님 책은 아마도 8086 기준이 아니라 다른 프로세서인듯합니다.
    프로세서마다 레지스터 이름이 다릅니다.
    제가 그 책을 읽어본적이 없어서 MAR은 모르겠습니다.

    1. PC나 IP나 같은 것입니다. 프로세서마다 크기는 다를 수 있습니다만 역할은 같습니다.
    2. 말씀하신대로라면 MAR은 20비트이고 CS:IP로 생성된 20비트 주소가 MAR에 들어간다? 정도로 이해할 수 있기도 합니다.
    하지만 8086을 공부하면서 MAR을 생각하는건 불필요합니다.
    지금은 CS:IP만 생각하고 나중에 다른 프로세서를 공부할 때는 그 프로세서에서 사용하는
    주소가 어떻게 생성되는지 따로 공부하면 된다고 생각합니다.
    대화보기
    • starlee3
      남시병 교수에 마이크로 프로세서 책을 읽어보면 어드레스가 16bit 고 databus가 8bit 프로세서들은
      PC->MAR(메모리 어드레스 레지스터) 저장하고 나서, 물리 번지를 생성한다 나옵니다. 다른책들에도

      그런데 어드레스 20bit 이고 data bus가 16bit 책(황희융교수책)에는 PC라는 말은 안나오고,
      CS : IP
      SS : SP,BP
      DS : BX,SI,DI
      ES : BX,SI,DI
      로 물리 번지를 생성한다 나오니!!!!!!!!!도통 헛갈립니다.

      질문1)
      그냥 8비트나 16비트나
      16비트나 8비트나 물리번지생성레지스터들은 비트에 차이지,똑같은데 즉~!!
      CS : IP(PC)
      SS : SP,BP
      DS : BX,SI,DI
      ES : BX,SI,DI

      위와같이 레지스터 구조는 같은데 IP나 PC나 같은 표현이라고 이해하면 될까요?

      질문2) 똑같으면
      CPU에 CS:IP(PC)가 순차적으로 카운터해 주면서
      메모리 코드 세크멘트 영역에 코드들은 읽어 들이는데 !!!!!!!!(어셈블 가상프로그램도 그렇게 작동하네요)


      대부분 책들에서는
      PC(IP)만 --->MAR로 가서 물리번지를 생성한다 나오니 개념이 도통 안 잡히네요. ??
      CS에 대한 이야기는 없고용~!! T.T
      정확히 말하면 CS:IP와 연산후 --->MAR로 저장하고 나서 물리번지 생성이 맞는말아닌가요?

      구글링해도 MAR은
      MAR(메모리 주소 레지스터) : 메모리로부터 읽어오거나 메모리에 쓰기 위한 주소를 가지고 있다.
      나오네요..
      16비트 CPU로 보면
      요점은 CS:PC(IP) 연산후 MAR로 저장하고 나서 물리번지를 생성한다 그 질문이죠?????
      그렇게 생각하면 MAR는 (20비트가 되네요?쩝)
      헛갈리네용~?!!

      헉헉헉 열공중임다! ^_____^;
    • gurugio
      MAR가 뭔가요? 제가 모르는 용어입니다.

      PC는 IP와 같은 것입니다. 이름만 다릅니다.
      IP외에 다른 레지스터들은 PC와 관련이 없습니다. 어떤 차이를 말씀하시는건지 모르겠습니다.
      대화보기
      • starlee3
        항상 친절한 답변 캄사합니다~!! ^^;

        어느책에서는 물리 번지 생성을 PC (Program Couter) PC 하는데 ...
        어느책에서는 CS,BS.SS,ES ,SP,BP,SI,DI,IP BX 다양한 조합을 이야기 하던데요....


        PC->MAR 로 가서 물리번지 생성~!!
        CS,BS.SS,ES ,SP,BP,SI,DI,IP BX-->MAR 물리번지생성인가요??

        요점은 PC랑 CS,BS.SS,ES ,SP,BP,SI,DI,IP BX 과 차이가 몬가요?
      버전 관리
      gurugio
      현재 버전
      선택 버전
      graphittie 자세히 보기