关于数组的建立与访问(16位汇编)
title: 关于数组的建立与访问(16位汇编)data: 2021-04-01 11:17:30author: Jamalphoto:https://cdn.pixabay.com/photo/2021/03/22/19/42/beach-6115569_960_720.jpgAssembly_LanguageReview1(array)16位汇编与32位汇编的区别1. 宽度的区别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位汇编是在windows或linux环境下的汇编语言。
16位汇编的寄存器和地址都是16位,32位汇编的寄存器和地址都是32位。
2. 调用操作系统函数时有区别
例如在屏幕上输出一句话:
32位汇编可以调用MessageBox这个函数,通过弹框输出;
16位汇编需要调用int 21h的9号功能。
使用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。
更多推荐
所有评论(0)