首页 /  技术专区  /  汇编语言 宽屏模式 >

段前缀的使用

1、引入段前缀:一个“异常”现象及对策

image.png

对策:在[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中 

image.png

分析: 

(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中

image.png

4、段前缀的使用

image.png



头像
0/200
图片验证码