关于数据的处理

计算机处理数据时有两个基本问题:
    1】处理的数据在什么地方;
    2】要处理的数据有多长;
 
1.bx、si、di、bp
在8086cpu中只有这四个寄存器可以用在“[...]”中,用来表示偏移地址;
 
1)bx
bx默认与段寄存器ds关联,用来表示数据段的偏移地址;
bx可以与si或di组合使用;
mov ax,[bx+si]
mov ax,[bx+di]
mov ax,[bx+si+5]
但si和di不能同时使用;
bx无法和bp混合使用;
 
2)bp
bp默认与段寄存器ss关联,用来表示栈段的偏移地址;
bp也可与si或di混合使用;
例如:将栈顶的值赋给ax
mov ax,[bp]
 
3)指定段寄存器
如果显式指定段寄存器,则bx也可用作栈段的偏移地址,bp也一样;
例如:
mov ax,ss:[bx]
 
2.机器指令处理的数据在哪
绝大多数机器指令都是进行数据处理的指令;
处理大致分为3类:读取、写入、运算;
机器指令不关心数据的值,只关心指令执行前一刻,将要处理的数据位置;
数据可能在3个地方:cpu内部、内存、端口;
如图:
 
1)数据位置的描述
汇编语言用3个概念来表达数据的位置:
    1】立即数(idata)    ->直接包含在机器指令中的数据; 执行前保持在cpu指令缓冲器;在汇编指令中直接给出数值;
mov ax,1
    2】寄存器    ->数据保存在寄存器中;在汇编指令中给出寄存器名;
mov ax,bx
     3】段地址(SA)和偏移地址(EA)    ->数据保存在内存中;以"[x]"给出EA,SA在某个段寄存器中;
mov ax,[bx]
mov ax,ss:[bx]
 
2)寻址方式
当数据存放在内存中时,有多种方式给定内存单元的偏移地址;定位内存单元的方式称为寻址方式;
常用的寻址方式:
 
3.指令要处理的数据有多长
8086cpu可以处理两种尺寸的数据:byte、word;
因此在机器指令中要指定是字节操作还是字操作;
 
1)通过寄存器名指定数据尺寸
例如:寄存器ax是16位,操作的是字
mov ax,1
而ax的低位寄存器al是8位,执行的是字节操作
mov al,1
 
2)使用 x ptr
在没有寄存器名存在的情况下,可用 x ptr 来指定内存单元的长度
x 表示 byte 或 word;
例如:
mov word ptr ds:[0],1
inc byte ptr [bx]
 
3)其他方法
例如栈中只能操纵字,如果是push指令,则必定是字
push [1000H]
 
4.寻址方式的灵活使用
例如:修改下图中的某几个数据
代码:
mov ax,seg
mov ds,ax
mov bx,60h
 
mov word ptr [bx+0Ch],38
add word ptr [bx+0Eh],70
 
mov si,0
mov byte ptr [bx+10h+si],'s'
inc si
mov byte ptr [bx+10h+si],'c'
inc si
mov byte ptr [bx+10h+si],'v'
 
5.div指令
div指令用作除法;
1)除数    ->有8位和16位两种,在寄存器或内存单元中;
2)被除数    ->如果除数为8位,则被除数为16位,默认放在ax中;
                    ->如果除数为16位,则被除数为32位,dx中存放高16位,ax中存放低16位;
3)结果    ->如果除数为8位,al储存商,ah储存余数;
                ->如果除数为16位,ax储存商,dx储存余数;
 
例如:计算100001/100
mov dx,1
mov ax,86a1h
mov bx,100
div bx
执行完成后,ax的值为03e8h(1000),dx的值为1
 
6.伪指令dd
定义数据的伪指令:
    db    ->DefineByte,定义字节型数据;
    dw    ->DefineWord,定义字型数据;
    dd    ->DefineDoubleWord,定义double型数据,double型数据占两个字的空间;
 
例如:在除法运算中使用伪指令dd
data segment
    dd 100001
    dw 100
    dw 0
data ends
    ...
mov ax,data
mov ds,data
mov ax,ds:[0]
mov dx,ds:[2]
div word ptr ds:[4]
mov ds:[6],ax
 
7.伪指令dup
dup的作用:和db、dw、dd等定义数据的伪指令配合使用,进行数据的重复;
格式:
    定义数据伪指令 重复次数 dup (重复的数据)
 
例如:定义3个值都是0的byte型数据
db 3 dup (0)
相当于
db 0,0,0
 
定义9个byte型数据
db 3 dup (0,1,2)
相当于
db 0,1,2,0,1,2,0,1,2
 
dup可以用来定义栈段,以简化代码量;
例如不用dup时,定义栈段
stack segment
    dw 0,0,0,0
    dw 0,0,0,0
    dw 0,0,0,0
stack ends
使用dup时
stack segment
    dw 12 dup (0)
stack ends
posted @ 2019-06-27 09:45  L丶银甲闪闪  阅读(153)  评论(0编辑  收藏  举报