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

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. 질문
    네, 답변 감사합니다.
    과제했어요.
    대화보기
    • 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 자세히 보기