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

assembly, 8086, x86

mov의 사용법 정리

mov 명령의 사용법을 총정리해보겠습니다.

일반적으로 메모리나 레지스터에 값을 읽고 쓰는 경우는 이렇습니다.

MOV REG, 메모리주소
MOV 메모리주소, REG
MOV REG, REG
MOV 메모리주소, 상수
MOV REG, 상수

 

reg는 레지스터를 말하는 것이고 상수는 0b800h같이 직접 숫자를 쓴 것을 말합니다.

mov dx, [bx]를 하면 메모리에서 16비트 값을 읽어서 dx 레지스터에 저장하는 것입니다.

그런데 한가지 주의할 것이 있습니다. mov [bx], 0ffh 라고 쓰면 어떻게 될까요?

[bx]의 메모리에 00ffh의 16비트를 쓰려는 것일까요? 아니면 0ffh의 8비트 값을 쓰려는 것일까요? 알아보려면 역시 실험을 해봐야겠지요.

org 100h
mov ax, 0b800h
mov ds, ax
mov bx, 0
mov cl, 'A'
mov ch, 11011111b
mov ds:[bx], cx
mov [bx+2], cx
mov si, 4
mov [bx+si], cl
mov [bx+si+2], cx
mov [bx], 0ffh
ret

 

이전 글에서 실험한 소스에 마지막으로 mov [bx], 0ffh를 추가한 것입니다. 0ffh를 쓰려는 주소는 0b8000h 이겠지요? 이 소스를 실험하기 위해서 에물레이터를 실행한 후에 에물레이터 화면 아래쪽에 있는 aux 버튼을 눌러봅니다. 또다른 메뉴가 나올겁니다. 메뉴에서 memory를 선택합니다. 그럼 아래 그림처럼 Random Access Memory라는 창이 나타납니다.

메모리 화면

update 버튼 왼쪽에 주소 값이 보이지요? 0700:0100으로 표시되어있을 것입니다. 여기를 클릭해서 주소 값을 지우고 b800:0000을 입력하고 update 버튼을 누릅니다. 어떤가요? 우리가 데이터를 쓰려는 메모리 위치에 어떤 값들이 저장되어있는지 나타납니다. 이제 single step으로 명령 하나씩 실행해보세요. 메모리에 값들이 바뀌는걸 확인할 수 있습니다. 그리고 mov [bx], 0ffh 명령을 실행하면 16비트 값이 바뀌나요? 아니면 8비트 값이 바뀌나요?

원래 써있던 41이라는 값이 FF로 변했습니다. 한바이트의 값만 변했습니다.

에물레이터 창에서 어셈블리 명령들이 출력된 칸을 보면 mov b.[bx], 0ffh라고 표시되는 것을 보실수 있습니다. 이 말은 mov byte ptr [bx], 0ffh를 줄여서 표시한 것입니다. byte ptr 이라는 말은 이 주소에 한 바이트만을 쓰겠다라는 표시입니다. 16비트를 쓰고 싶다면 word ptr [bx] 라고 쓰면 되지요.

그럼 mov byte ptr [bx], 0ffh 로 바꿔서도 해보고, mov word ptr [bx], 0ffh로 바꿔서도 실험해보세요. 한바이트 값이 바뀌기도 하고 두바이트 값이 바뀌기도 할 것입니다.

 

댓글

댓글 본문
작성자
비밀번호
  1. ㅇㅇ
    x86 architecture : little endian
  2. 빨간공
    프로세서의 리얼모드에서 0b800h는 비디오 메모리 어드레스의 주소라고 합니다. 해당 주소의 16비트로 크기인데 구성은 [배경색 4비트][전경색 4비트][문자 8비트]로 구성됩니다. 메모리 크기는 가로 80 * 세로 25 * 2바이트( 앞에서 살펴본 배경색,전경색,문자) = 4000바이트입니다.

    [메모리 구성]
    **** **** **** **** <- 0b800h
    **** **** **** **** <- 배경 4비트 전경 4비트 문자 8비트
    ....
    **** **** **** **** <- 0b800h + 80 * 25
    대화보기
    • 0b800h
      0b800h이게 대체 뭐죠??
      이거 말고 다른수 쓰면 출력이 안되던데 뭔가요?
    • 참치통조림
      그러네요.
      고맙습니다.
    • gurugio
      아 ; 네요.
      대화보기
      • gurugio
        잘 기억이 안나네요.
        ; 나 #으로 한번 해보시겠어요?
        대화보기
        • 참치통조림
          좋은 강의 감사합니다.

          워드단위로 입력하면 램에 거꾸로 기록되는게 인상적입니다. 마치 스텍처럼...

          그리고 혹시 주석문 넣는 방법이 있을까요? C의 /, /**/ 같은...

          org 100h

          mov ax, 0b800h
          mov ds, ax
          mov ch, 11011111b
          mov si, 0a0h

          mov cl, 'H'
          mov ds:[bx+si], cx
          mov cl, 'e'
          mov ds:[bx+si+2], cx
          mov cl, 'l'
          mov ds:[bx+si+4], cx
          mov ds:[bx+si+6], cx
          mov cl, 'o'
          mov ds:[bx+si+8], cx
          mov cl, '!'
          mov ds:[bx+si+10], cl

          mov cx, [bx+si+10]
          mov [bx+si+12], cx
          mov cx, [bx+si+8]
          mov [bx+si+10], cx
          mov cx, [bx+si+6]
          mov [bx+si+8], cx
          mov cx, [bx+si+4]
          mov [bx+si+6], cx
          mov cx, [bx+si+2]
          mov [bx+si+4], cx
          mov cx, [bx+si]
          mov [bx+si+2], cx

          mov b.[bx+si],'>'
          mov byte ptr [bx+si+2], 03eh
          mov word ptr [bx+si+4], 0073eh
          mov w.[bx+si+6], 0073eh
          mov [bx+si+8], 03eh
          mov [bx+si+10], 0073eh
          ret
        버전 관리
        gurugio
        현재 버전
        선택 버전
        graphittie 자세히 보기