前言

        写程序的过程中,我们会用到许多数据,包括图片、视频、长文本等,这些数据在程序运行前就应该同代码一起暂存至内存中,同时,栈空间也需要预先分配。今天我们来学习一下汇编中存放数据的方式。


操作符X ptr

        8086CPU支持处理尺寸为1byte或1word。在汇编指令中,如果存在寄存器,那么可以由寄存器名直接指明操作数据的尺寸。例如:

mov ax,[0];字操作(ax为16位寄存器)
mov al,[0];字节操作(al为8位寄存器)

        但是如果没有寄存器名存在,那我们可以用操作符X ptr指明内存单元长度,例:

mov word ptr [0],1
inc word ptr [0]
add word ptr [0],1
;用word ptr指明操作的是一个字
mov byte ptr [0],1
inc byte ptr [0]
add byte ptr [0],2
;用byte ptr指明操作的是一个字节


伪指令db、dw、dd

        这三个指令都是伪指令,为了方便程序员快速向内存中写入数据而存在,格式:

db/dw/dd 数据1,数据2,...;可以写入任意个数字节型/字型/双字型数据

        同时,dw也可以用于写入字符串,每个字符占1个字,例:

dw 'faryou'


dup操作符

        dup操作符的存在可以让我们更方便地写入重复数据,它在使用时与db/dw/dd联用,格式:

db/dw/dd 重复次数 dup (重复的数据)

        例如:

db 5 dup (0);相当于:db 0,0,0,0,0
db 5 dup (0,1,2,3,4);相当于:db 0,1,2,3,4,0,1,2,3,4,0,1,2,3,4,0,1,2,3,4,0,1,2,3,4
dw 5 dup ('faryou ','HJCBBS ');相当于:dw 'faryou HJCBBS faryou HJCBBS faryou HJCBBS faryou HJCBBS faryou HJCBBS'


div除法指令

        div是除法指令,但是其格式与add、sub不同,其需要与ax寄存器或dx&ax寄存器联合使用,格式:

div 寄存器名/内存单元

        div可以进行两种除法:

第一种(在div指令中用byte ptr指明):

        被除数(16位):存放于ax寄存器中

        除数(8位):存放于div指令中指明的寄存器/内存单元中

        商(8位):存放于al寄存器中

        余数(8位):存放在ah寄存器中


第二种(在div指令中用word ptr指明):

        被除数(32位):存放于dx&ax寄存器中,其中dx存放高16位,ax存放低16位

        除数(16位):存放于div指令中指明的寄存器/内存单元中

        商(16位):存放于ax寄存器中

        余数(16位):存放于dx寄存器中

        下面举个例子:

计算114514/123

        代码如下:

;先将114514转到16进制:19842H
mov dx,0001H
mov ax,9852H
mov bx,123
div bx

        执行后,ax=007cH,dx=0001H


结语

        本文介绍了汇编语言中存数据的一些方式与格式,希望能帮到读者。我是faryou,下次见!