汇编之寄存器(内存访问)之字与字节的传送

俗话说的好,温故而知新!

内存中字的存储

8086CPU中,用16位寄存器来存储一个字。高8位存放高位字节,低8位存放低位字节。在内存中存储时,由于内存单元是字节单元(一个单元存放一个字节),则一个字要用两个地址连续的内存单元来存放。比如我们从0地址开始存放20000,图示:
在这里插入图片描述

上图中,我们用0、1两个内存单元存放数据20000(4E20H),0、1两个连续的内存单元用来存储一个字,这两个连续的内存单元可以看作一个起始地址为0的字单元

问题:

  • 1地址字单元中存放的字型数据是多少?
  • 2地址字单元中存放的字型数据是多少?
  • 2地址单元中存放的字节型数据是多少?
  • 0地址字单元中存放的字型数据是多少?
  • 0地址单元中存放的字节型数据是多少?

分析:

  • 1地址字单元中存放的字型数据是:124EH
  • 2地址字单元中存放的字型数据是:0012H
  • 2地址单元中存放的字节型数据是:12H
  • 0地址字单元中存放的字型数据是:4E20H
  • 0地址单元中存放的字节型数据是:20H

DS和[address]

8086CPU中有一个DS寄存器,通常用来存放要访问数据的段地址,比如我们要读取10000H单元的内容,可以用如下程序段进行:

mov bx,1000H
mov ds,bx
mov al,[0]               ; “[...]”表示一个内存单元,“[...]”中的0表示内存单元的偏移地址。
                         ; 指令执行时,8086CPU自动取ds中的数据为内存单元的段地址

其中 mov al,[0] 代表:将一个内存单元(字节单元)送入al,完成数据从1000:0单元到al的传送。这条指令执行时,ds中的内容应为段地址1000H,所以在这条指令之前应该将1000H送入ds寄存器。

问题:
如何将al中的数据送入内存单元10000H中?

分析:

mov bx,1000H
mov ds,bx
mov [0],al                ; 将al中的数据送入内存单元10000H中

字的传送

前面我们用mov指令在寄存器和内存之间进行字节型数据的传送。因为8086CPU是16位结构,有16根数据线,所以可以一次性传送16位的数据,也就是一次性传送一个字(两个字节或16比特),如下:

mov bx,1000H
mov ds,bx
mov ax,[0]                ; 1000:0处的字型数据送入ax
mov [0],cx                ; cx中16位数据送到1000:0处

问题:
内存中的情况如下,写出下面的指令执行后寄存器ax,bx,cx中的值?

mov ax,1000H
mov ds,ax
mov ax,[0]
mov bx,[2]
mov cx,[1]
mov bx,[1]
mov cx,[2]

在这里插入图片描述

分析:
指令执行后,ax=1123H,bx=2211H,cx=6622H

mov ax,1000H
mov ds,ax
mov ax,[0]                ; 将1000:0处字单元的内容送入ax,此时ax=1123H
mov bx,[2]                ; 将1000:2处字单元的内容送入bx,此时bx=6622H
mov cx,[1]                ; 将1000:1处字单元的内容送入cx,此时cx=2211H
mov bx,[1]                ; 将1000:1处字单元的内容送入bx,此时bx=2211H
mov cx,[2]                ; 将1000:2处字单元的内容送入cx,此时cx=6622H

操作符X ptr

在没有寄存器名存在的情况下, 用操作符X ptr指明内存单元的长度,X在汇编指令中可以为word或byte,如下:

;下面的指令中,用word ptr指明了指令访问的内存单元是一个字单元
mov word ptr ds:[0],1             
inc word ptr [bx]
inc word ptr ds:[0]
add word ptr [bx],2

;下面的指令中,用byte ptr指明了指令访问内存单元是一个字节单元
mov byte ptr ds:[0],1
inc byte ptr [bx]
inc byte ptr ds:[0]
add byte ptr [bx],2

但有些指令默认了访问的是字单元还是字节单元,比如:push [1000H] 就不用指明,因为push指令只进行字(两个字节)操作。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值