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

assembly, 8086, x86

배열

배열은 연속된 변수들로 볼 수 있습니다. 연속되었다는 말은 메모리상에서의 위치가 연속적으로 자리를 잡고 있다는 뜻입니다. 1000h 번지에 위치는 8비트 변수가 있고 1001h에도 있고 1002h에도 있다면 이 3개의 변수를 합쳐서 하나의 배열로 만드는 것이지요. 배열이란 변수들 여러개를 붙여놓은 것입니다.
예를 들어 문자열은 바이트 배열입니다. 각각의 바이트는 출력하려는 문자의 ASCII 코드값을 나타냅니다. 1바이트 문자라는 변수들을 여러개 붙여놓은 것이지요.
 
여기 배열을 선언하는 예를 보겠습니다.
 
a DB 48h, 65h, 6Ch, 6Ch, 6Fh, 00h
b DB 'Hello', 0 
 
b 는 a배열과 정확히 같습니다. 컴파일러는 따옴표안에 있는 문자열을 바이트의 집합으로 변경합니다. 아래 차트는 이 배열이 선언되었을 때 메모리를 보여줍니다. 문자열의 마지막은 문자가 아니라 0이라는 것에 주의하세요. 0은 문자열이 끝났다는 것을 말해줍니다. 0이 없다면 문자열을 읽다가 문자열이 언제 끝나는지 알수가 없으니까요.
 
 
배열의 원소는 []를 사용하여 접근할 수 있습니다. 예를 들면:
 
MOV AL, a[3] 
이렇게 실행하면 al에는 6ch 값이 저장됩니다.
 
또는 메모리 인덱스 레지스터(BX, SI, DI, BP)를 사용할 수도 있습니다.
 
MOV SI, 3
MOV AL, a[SI]
 
큰 배열을 선언할 때, DUP 연산자를 사용할 수 있습니다. DUP의 문법은 다음과 같습니다. 
 
숫자 DUP ( 값(s) )
숫자 - 복사할 횟수 (상수값이어야 함).
값 - 복사할 데이터 
 
예를 들어 
 
c DB 5 DUP(9)
 
는 다음과 같습니다. 
 
c DB 9, 9, 9, 9, 9
 
 
예를 하나 더 들면 
 
d DB 5 DUP(1, 2)
 
는 다음과 같습니다. 
 
d DB 1, 2, 1, 2, 1, 2, 1, 2, 1, 2
 
 
물론, 255보다 크거나 -128보다 작은 값이 필요한 경우, DB 대신 DW를 사용할 수 있습니다. DW는 문자열을 선언할 때는 사용할 수 없습니다. 
문자열과 메모리 접근을 배웠으니 스크린에 hello, world를 출력하는 예제를 한번 만들어보세요.

댓글

댓글 본문
작성자
비밀번호
  1. b[0]은 C에서 배열을 쓸때 사용하는 문법이고 어셈블러의 문법은 아닌것 같습니다.
    lea dx, b
    mov cl, [dx]
    add dx, 1
    mov cl, [dx]
    이런 방식으로 하나의 레지스터에 주소를 넣고, 그 레지스터의 주소에서 값을 읽는 방식이 되야될것 같습니다.
    대화보기
    • Moongi Kim
      감사히 배우고 있습니다.
      지금까지 배운 것으로 스크린에 Hello world를 띄우려 노력하고 있는데 잘 되지 않아 질문 드립니다.
      일단 스크린의 특정 위치에 띄우기 위해선 ds가 일정 범위 이내여야 하고, 그러려면 ax에 값을 넣어 ds로 전달해야 한다는 것 까지 이해했습니다.
      문제는 그 다음인데요,
      cl에 48h를 mov 하면 정상적으로 H가 뜨지만
      b DB 'Hello, World', 0 이란 변수추가를 한 뒤에
      mov cl, b[0]으로 변경하면 스크린에 H가 뜨지 않습니다...
      일단 문자열 전체를 띄우기 전에 한 글자 띄우는 것 부터 실패하고 있는데,
      어디서부터 제가 잘못 이해하고 있는건지 궁금합니다.

      지금까지 배운 것들 중에서 제가 활용을 못하고 있는 부분이 어디에 있는지 알고 싶습니다.
    • 유상원
      2017-09-24 읽었습니다.
    • 질문
      네, 답변 감사합니다.
      과제했어요.
      대화보기
      • gurugio
        "메모리 읽고 쓰기" 문서에서 설명한 내용입니다. 특정 메모리 주소에 문자 코드를 쓰면 됩니다.
        대화보기
        • 질문
          목록 위에서 아래로 차례대로 학습하고 있습니다.
          문자열과 메모리 접근은 배웠지만 출력은 어떻게 해야하는지 배우지 못했습니다.

          인터럽트를 사용하지 않고 문자열을 출력 하려면 어떻게 해야 하나요?
        • starlee3
          질문1) 어셈블리에서 연산자 [ ] 는 주소이니까 !!
          예를 들어 a[3]는 [a+3]으로 바꾸어 표현할수있나요?
          그렇다면 a는 주소겠네요?

          질문2)visul c++ 디스 어셈블 하면
          왜? a[3] 표현하죠? _a$[bp+4] 표한하죠? 그냥 이해하기 쉽게 [a+3] ,[bp+_a$+4] 이렇게 하며 되는데 ???

          $의미는 무엇인지?궁금하군요? a[bp+4]쓰지? 쩝 ????
        버전 관리
        gurugio
        현재 버전
        선택 버전
        graphittie 자세히 보기