어셈블리 언어 기본 데이터 형식

본고 개요: 8086 어셈블리의 기본 데이터 유형, 예를 들어 정형, 문자, 문자열, 수조, 구조체의 정의와 인용 방법을 소개한다.
 

정수


어셈블리에서 정수는 바이트(db), 글자(dw), 쌍둥이(dd) 등 유형으로 나눌 수 있다.
<1> 정수 변수의 정의
정수 정의 형식: (변수 이름)(데이터 유형)(데이터)
data segment year dd 2015 month dw 5 day db 8 data ends

 
<2> 정수 변수의 인용
정수 변수를 정의하고 DS를 데이터 세그먼트의 주소로 가리킨 후 어셈블리 언어 코드에서 변수 이름을 직접 사용할 수 있다.변수 이름의 사용 방법은 고급 언어(예를 들어 C 언어)와 거의 같다.
예:
data segment a dw 1, 2 b dw 2 data ends code segment Assume cs: code, ds: data start:
       mov ax, data mov ds, ax mov ax, a add ax, b mov ax, a + 2
       add ax, b mov ah, 4ch int 21h code ends end start

이 코드에서dw타입 수조 변수 a와dw타입 변수 b를 정의하고 a[0]+b와 a[1]+b 기능을 실현한다.
어셈블리 언어에서 변수 이름 = [변수 편이 주소], 어셈블리 소스 코드를 컴파일하여 변수 이름을 대응하는 변수 편이 주소에 대한 직접 주소로 변환한다.
변수 이름 + idata = [변수 편이 주소 + idata];
변수 이름 [reg] = [변수 편이 주소 + (reg)]는 레지스터의 상대적인 주소 찾기와 유사하다.
 

2. 문자와 문자열이 메모리에서의 표시와 처리


<1> 문자의 정의
형식 정의: (문자 변수 이름)(데이터 유형)(데이터)
1) 가시 문자의 ASCII 코드 값은 가시 문자에 작은 따옴표로 표시할 수 있습니다.
2) 보이지 않는 문자의 경우 캐리지 리턴 줄 바꿈: 0AH, 0DH와 같은 ASCII 코드 값으로만 표시할 수 있습니다.
 
<2> 문자열의 정의
문자열 정의는 "Hello world!"같은 여러 문자를 인용 부호나 더블 인용 부호로 만들면 됩니다.
data segment Str   db 'Hello, world!', '$' EnMsg db 0ah, 0dh, '$' data ends code segment Assume cs: code, ds: data start:
       mov ax, data mov ds, ax mov dx, offset Str
       mov ah, 09h int 21h mov dx, offset EnMsg int 21h mov ah, 4ch int 21h code ends end start

이 원본 파일에서 Str 문자열 데이터 구조와 Enmsg 문자 데이터 구조를 정의하고 09h 시스템 기능 호출을 호출하여 두 문자열을 출력한다.
09h 시스템 기능을 호출할 때, 시스템은 레지스터 dx에 저장된 주소로 시작하는 메모리 단원의 문자열을 '$' 문자가 될 때까지 출력합니다.
 

3. 수조 정의 방법과 사용


같은 C 언어와 같고, 수조는 같은 데이터 형식의 여러 수로 구성된다.어셈블리 언어에서 위조 명령 dup을 제공하여 그룹을 정의한다.
1) 1차원 배열 정의 형식:
(수 그룹 이름) (수 그룹 요소 데이터 형식) (수 그룹 개수)dup(수 그룹 요소 초기값)
(그룹 이름) (그룹 요소 데이터 형식) (n 개의 그룹 요소의 초기 값)
2) 2D 배열 정의 형식:
(수 그룹 이름) (수 그룹 요소 데이터 형식) (2차원 수 그룹 행수)dup (1차원 수 그룹 요소)
 
코드: 20*16의db 형식 그룹 A를 정의하고 A[2][8]에 8을 부여한다.
data segment A db 20 dup(16 dup(0)) data ends code segment Assume cs: code, ds: data start: mov ax, data mov ds, ax mov al, 2
       mov cl, 16
       mul cl add ax, 8
       mov bx, ax mov a[bx], 8
       
       mov ah, 09h int 21h code ends end start

이 코드에서 a[bx]=(변수 a의 편이 주소)+(bx))를 주의하면 레지스터의 상대적인 주소 찾기에 해당하고 레지스터는 index 레지스터와base 레지스터, 즉si,di,bp,bx 레지스터만 사용할 수 있습니다.
 

4. 구조체의 정의 방법과 사용


<1> 구조체 정의
구조체 정의는 C 언어와 기본적으로 같고 형식은 다음과 같습니다.
struct_name struct
data_items
struct_name ends
 
<2> 구조체 변수 정의
구조체 변수 정의는 다른 데이터 형식 정의와 기본적으로 같지만 기본 데이터 형식을struct 로 바꿉니다name
variable_name struct_name data
 
<3> 구조체 할당값
구조체 부치는 부분적으로 부칠 수 있다.
data segment Circle struct x dd ? y dd ? radius ? Circle ends FirstCircle Circle {} SecondCircle Circle {10, , ,} ThirdCircle Circle {10, 10, } FourthCircle Circle {10, 10, 20} data ends

 
<4> 구조체 인용
구조체 인용은 C 언어 인용에 기본적으로 같다.
data segment Circle struct x dd ? y dd ? radius ? Circle ends oneCircle Circle {10, 10, 20} tenCircle Circle 10 dup({10, 10, 20}) data ends code segment Assume cs: code, ds: data start:
      mov ax, data mov ds, ax mov oneCircle.x, 20
      mov oneCircle.y, 30
      mov oneCircle.radius, 100
      mov tenCircle[0].x, 20
      mov tenCircle[1].y, 30
      
      mov ah, 4ch int 21h code ends end start

PS: 어셈블리 언어 컴파일러 버전은 MASM611이며 다른 컴파일러에서 컴파일 오류가 발생할 수 있습니다.
 

5. 구조체 중첩


구조체 중첩은 C 언어와 유사하며 중첩에서 structname 일반적인 기본 데이터 형식 이름으로 간주하면 됩니다
data segment
Point struct
x dd  ?
y dd  ?
z dd  ?
Point ends

Pixel struct
 Pt Point {}
 Color dw ?
Pixel ends
data ends

 

바늘


코드에서 포인터는 주소로 정의할 필요가 없다.
데이터에서 지침을 정의하는 방법은 비교적 간단하다.데이터에서 변수 이름을 사용하는 것은 포인터 값이지만 코드에서 변수 이름을 사용하는 의미는 주소가 아닙니다. 예를 들어 다음과 같습니다.
data segment A db 0 B db A ; A 
data ends code segment Assume cs: code, ds: data start:
      mov ax, data mov ds, ax mov bx, B    ; A mov bx 
      mov al, [bx] ; A mov al 
      mov ah, 4ch int 21h code ends

코드 mov bx, B에서 B = (변수 B의 오프셋 주소) 는 데이터 정의와 같이 A가 변수 A의 오프셋 주소를 대표하는 것이 아니라 주의하십시오.
이 코드는 MASM611에서 컴파일되어 다른 컴파일러가 통과할 수 없습니다.

좋은 웹페이지 즐겨찾기