关于数组的建立与访问(16位汇编)


title: 关于数组的建立与访问(16位汇编)
data: 2021-04-01 11:17:30
author: Jamal
photo:

  • https://cdn.pixabay.com/photo/2021/03/22/19/42/beach-6115569_960_720.jpg
  • Assembly_Language

Review1(array)

16位汇编与32位汇编的区别

1. 宽度的区别

16位汇编是在dos环境下的汇编语言。

32位汇编是在windowslinux环境下的汇编语言。

16位汇编的寄存器和地址都是16位,32位汇编的寄存器和地址都是32位。

2. 调用操作系统函数时有区别

例如在屏幕上输出一句话:

32位汇编可以调用MessageBox这个函数,通过弹框输出;

16位汇编需要调用int 21h9号功能。

使用16位寄存器及地址与使用32位寄存器及地址在__语法__上差别不大。

eg.

mov ax, 1;   //16位寄存器
mov eax, 1;  //32位寄存器
mov word ptr ds : [1000h], 1234h;     //16位地址
mov word ptr ds : [00401000h], 1234h; //32位地址

3. 关于Register

32位汇编中,寄存器是32位的。以eax举例,它的低16位就称为ax,高16位没有名字。

16位汇编中,寄存器是16位的。以ax举例,它的低8位称为al,高8位称为ah

汇编中数组的定义与使用

1. 定义

汇编的类型根据变量的长度来进行区分,因此定义变量时使用五个关键字:DB DW DD DQ DT(常用DB,DW)

DB (Define Byte) : 即定义的变量占一个字节的长度。(将定义的变量值放入一个字节的内存空间)unsigned char

eg.

a DB 7h  ;将7h放入内存的某一个字节
a DB 'h' ;存入h的ASCⅡ码48h 

同样,可以通过DB定义数组

a DB 48h, 65h, 6Ch, 6Ch, 6Fh, 00h 
;等价于
b DB 'Hello',0

定义一个具有一系列相同元素的数组可以使用DUP关键字。

c DB 6 DUP(6)
;等价于
c DB 6,6,6,6,6,6
d DB 3 DUP(1,2)
;等价于
d DB 1,2,1,2,1,2

DW(Define Word) : 定义一个字(两个字节)。unsigned short int

DD(Define Double word) : 定义双字(四个字节)。定义一个32位小数(即float类型)

DQ(Define Quartet word) : 定义四字(八个字节)。可定义64位整数quadruple word或double类型的小数

DT(Define Ten Byte) : 定义十字。可以定义一个80位的小数(即long double类型的小数)

2.引用

与C语言形式类似,汇编中表示数组的形式也是数组名 [ 下标 ],但需要注意的是在引用数组元素之前,必须先保证段寄存器**ds中已经保存了该数组的段地址**。

段地址 + 偏移地址 ⟹ \Longrightarrow 真实地址(远指针)

比如这样的一块数据段定义

data segment
a DB 100 dup(0)
b DB "Hello", 0Dh, 0Ah
data ends

在下面的程序中如果想要访问数组a或者b中的元素,就需要在访问之前在ds中保存数组的段地址。

对于这段数据段定义,数组a和b的段地址是相同的,他们的区别在于偏移地址

段地址的表达方式有两种,因此下面两句是等价

mov ax, seg a
mov ax, data

我觉得可以这么理解,data segment就是定义了一个连续的空间,用于存放数组元素。类似于C语言的一个数组,数组名就是数组的地址,即data.而对于 seg a 这种表达方式很直观没有什么赘述的。

在这里有一点细节,就是以s结尾的寄存器是段寄存器,段寄存器有一个怪脾气:不直接接受常数。需要一个临时寄存器在中间中转一下。像下面这样:

mov ax, data
mov ds, ax

下面举一个访问修改数组中的值的操作的例子。

mov di, 0 ;di作为数组a的下标
mov ah, 01h ;
int 21h ;调用21的1号功能:读取一个字符,并将读取的值放在al中
mov a[di], al ;将读取的字符的ascⅡ存入数组
add di, 1 ;数组下标加一

注意: db是一个byte,相当于C语言中的char,而16位的寄存器有两个byte,所以赋值的时候不要忘记只用寄存器的一半,即al或者ah。

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值