1、引入段前缀:一个“异常”现象及对策
对策:在[idata]前显式地写上段寄存器
mov ax,2000h mov ds,ax mov bx,0 mov al,ds:[bx] mov ax,2000h mov ds,ax mov al,ds:[0]
小结(在程序中):
mov al,[0]:(al)=0,同mov al,0 mov al,ds:[0]:(al)=((ds)*16+0) mov al,[bx]:(al)=((ds)*16+(bx)) mov al,ds:[bx]:与mov al,[bx]相同
这些出现在访问内存单元的指 令中,用于显式地指明内存单 元的段地址的“ds:”、“cs:”、 “ss:”或“es:”,在汇编语言 中称为段前缀。
2、访问连续的内存单元——loop和[bx]联手!
问题:计算ffff:0~ffff:b字节单元中的数据的和,结果存储在dx中
分析:
(1)运算后的结果是否会超出 dx 所能存储的范围?
ffff:0~ffff:b内存单元中的数据是字节型数据,范围在0~255之间,12个 这样的数据相加,结果不会大于 65535,可以在dx中存放下。
(2)是否可以将 ffff:0~ffff:b中的数据直接累加到dx中?
add dx, ds:[addr] ;(dx)=(dx)+?
期望:取出内存中的8位数据进行相加
实际:取出的是内存中的16位数据
(3)是否可以将 ffff:0~ffff:b中的数据直接累加到dl中?
add dl, ds:[addr] ;(dl)=(dl)+?
期望:取出内存中的8位数据相加
实际:取出的是内存中的8位数据,但很有可能造成进位丢失。
对策:取出8位数据,加到16位的寄存器
mov al, ds:[addr] mov ah, 0 add dx, a
3、计算ffff:0~ffff:b单元中的数据的和,结果存储在dx中
4、段前缀的使用