您的位置:首页 > 博客中心 > 编程语言 >

汇编语言基本数据类型

时间:2022-03-25 02:49

本文概要:介绍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)],类似于寄存器相对寻址;

 

二、字符及字符串在内存中的表示与处理

<1> 字符的定义

定义格式: (字符变量名) (数据类型) (数据)

1)对于可见字符,其ASCII码值可以用该可见字符加上单引号表示;

2)对于不可见字符,只能用其ASCII码值表示,如回车换行符: 0AH, 0DH

 

<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中的地址开始的内存单元的字符串,直到某个字符为‘$’;

 

三、数组定义方法与使用

同C语言相同,数组是由同一数据类型的多个数组成;在汇编语言中,提供了伪指令dup来定义数组;

1)一维数组定义格式:

(数组名)(数组元素数据类型)(数组个数) dup(数组元素初值)

(数组名)(数组元素数据类型)(n个数组元素的初值)

2) 二维数组定义格式:

(数组名)(数组元素数据类型)(第二维数组行数) dup(第一维数组元素)

 

代码:定义一个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寄存器。

 

四、结构体定义方法与使用

<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,可能在其他编译器中编译错误

 

五、结构体嵌套

结构体嵌套类似于C语言,在嵌套中将struct_name 看做为一般的基本数据类型名即可

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下编译通过,其他编译器无法保证通过。

本类排行

今日推荐

热门手游