一、汇编语言中,为什么SI和DI不能同时使用汇编
其实你可以想一下,这两个寄存器的意思,SI源变址寄存器,DI目地变址寄存器,既然是变址寄存器,那么他们肯定是在某个地址的基础上进行偏移变化,由此我们就得出了需要基址寄存器。
你要是把这两个寄存器同时使用,那你地址变化的基址都没有,你该怎么变化呢?你在谁的基础上变化(也就是地址偏移)?
对于这些汇编中的规定,其实有时并不需要书上详细的介绍,我们都应该可以从中推导出这些规则,书上的那些介绍个人认为只是用来验证我们的推测的。或是对我们所掌握的知识的进行检测,用来说明我们所掌握的是对的!
1:数据寄存器,一般称之为通用寄存器组
8086 有8个8位数据寄存器,
这些8位寄存器可分别组成16位寄存器:
AH&AL=AX:累加寄存器,常用于运算;
BH&BL=BX:基址寄存器,常用于地址索引;
CH&CL=CX:计数寄存器,常用于计数;
DH&DL=DX:数据寄存器,常用于数据传递。
2:地址寄存器/段地址寄存器
为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:
CS(Code Segment):代码段寄存器;
DS(Data Segment):数据段寄存器;
SS(Stack Segment):堆栈段寄存器;
ES(Extra Segment):附加段寄存器。
3:特殊功能的寄存器
IP(Instruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;
SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。
BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置;
SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针;
DI(Destination Index):目的变址寄存器,可用来存放相对于 ES 段之目的变址指针。
二、si,di使用的例子
SIDI是8086CPU中和bx功能相近的寄存器,SIDI不能够分成两个8位寄存器来使用.
下面三组指令实现了相同的功能:
(1) mov bx,0
mov ax,[bx]
(2) mov si,0
mov ax,[si]
(3) mov di,0
mov ax,[di]
下面的三组指令也实现了相同的功能:
(1) mov bx,0
mov ax,[bx+123]
(2) mov si,0
mov ax,[si+123]
(3) mov di,0
mov ax,[di+123]
用寄存器SI和DI实现将字符串 'welcome to masm!' 复制到它后面的数据区中.
assume cs:codesg,ds:datasg
datasg segment
db 'welcome to masm!'
db '............................'
datasg ends
分析:
我们编写的程序大都是进行数据的处理,而数据在内存中存放,所以我们在处理数据之前首先要搞清楚数据存储在什么地方,也就是说数据的内存地址.现在我们要对datasg段中的数据进行复制,我们先来看以下要复制的数据在什么地方,
datasg:0,这是要进行复制的数据的地址.那么复制到那里去呢?它后面的数据区.'welcome to masm!'从偏移地址0开始存放,长度为16个字节,所以,他们后面的数据区的偏移地址为16,就是字符串所要存放的空间,清楚了地址之后,我们就可以进行处理了.我们的ds:si指向要复制的原始字符串,用ds:di指向复制的目的空间,然后一个循环来完成复制,
代码如下:
codesg segment
start:mov ax,datasg
mov ds,ax
mov si,0
mov di,16
mov cx,8
s:mov ax,[si]
mov [di],ax
add si,2
add di,2
loop s
mov ax,4c00H
int 21H
codesg ends
end start
注意在程序中, 我们用的16位寄存器进行内存单元之间的数据传送,一次复制2个字节,一共循环8次(si和di每次加2)
用更少的代码,实现:
分析:
我们可以利用[bx(si或di)+idata]的方式,来使程序变得简洁.如下:
codesg segment
start:mov ax,datasg
mov ds,ax
mov si,0
mov cx,8
s:mov ax,0[si]
mov 16[ax],ax
add si,2
loop s
mov ax,4c00H
int 21H
codesg ends
end start
分享到:
相关推荐
基址加变址的寻址方式是把一个基址寄存器BX或BP的内容,加上变址寄存器SI或DI的内容,并以一个段寄存器作为地址基准,作为操作数的地址。 当基址寄存器为BX时,段寄存器使用DS,当基址寄存器为BP时,段寄存器用SS。 ...
5. SI寄存器:是源索引寄存器,用于存储数组或字符串的索引。 6. DI寄存器:是目的索引寄存器,用于存储数组或字符串的索引。 7. BP寄存器:是基址指针寄存器,用于存储堆栈的基址。 8. SP寄存器:是堆栈指针寄存器...
2. **指针/变址寄存器**:SP/ESP、BP/EBP、SI/ESI和DI/EDI这四个寄存器,除了存储数据外,主要在存储器寻址时提供偏移地址。SP/ESP是堆栈指针,指示栈顶的位置。 3. **标志寄存器FLAG**:包含条件码标志,如CF...
在x86架构中,这些寄存器包括AX、BX、CX、DX、SI、DI、BP和SP。其中,AX、BX、CX和DX可以进一步分为两个8位寄存器,如AX可以分为AH和AL 。 b. 段寄存器 段寄存器用于实现内存分段机制。在x86架构中,主要有CS(Code...
例如,使用AX和BX进行乘法运算,使用CX进行循环计数,利用DI和SI进行字符串处理,以及通过修改FLAGS寄存器的标志位来控制程序的条件分支。 通过学习"04664IBM—PC汇编语言程序设计(第二版)"这样的教材,学生可以...
寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。变址寄存器不可分割成8位...
* 8086CPU有14个寄存器,它们的名称为:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。 * 寄存器可以分为两类:通用寄存器和专用寄存器。 二、寄存器的类型 * 通用寄存器:AX、BX、CX、DX,用于存放...
* 寄存器间接寻址方式:EA在基址寄存器(BX/BP)或变址寄存器(SI/DI)中,例如MOV AX, [BX]和MOV AX, ES:[BX]。 * 寄存器相对寻址方式:EA在基址寄存器(BX)和变址寄存器(SI)中,例如MOV AX, COUNT[SI]。 * 基址...
在内存操作中,`[BX+SI]`这样的表达式代表了基于基址寄存器BX和变址寄存器SI的偏移地址,这种寻址方式允许访问内存的不同区域。`MOV AX, DS:[BP+DI]`则展示了如何跨越默认段地址(在这里是DS),直接指定内存操作。 ...
寄存器间接寻址是指操作数是在存储器中,但是,操作数地址的16位偏移量包含在四个寄存器SI、DI、BP、BX 之一中。例如:MOV AX,[SI] 操作数地址是:(DS)*16+(SI)。 5. 变址寻址 变址寻址是指由指定的寄存器...
- **变址寄存器**:DI、EDI和SI、ESI。它们在数组处理和字符串操作中作为源或目标地址。 3. **专用寄存器**: - **指令指针**:IP(16位)、EIP(32位)。它们指示下一条待执行指令的地址。 - **标志寄存器**:...
6. **基址、变址寻址**:基址寄存器(BX或BP)与变址寄存器(SI或DI)结合使用,形成一个相对复杂的寻址方式。例如,`MOV AX, [BX+SI]`会从DS段寄存器内容加上BX和SI寄存器内容之和的地址处获取数据。 这些寻址方式...
SI 寄存器存放关键字的指针,DI 寄存器存放句子中的字段的指针,CX 寄存器存放关键字的字母个数。 5. 程序执行过程:程序的执行过程可以分为以下几个步骤:首先,输入用户的句子和关键字,然后在句子中查找关键字,...
8086CPU有14个寄存器,包括AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW等。这些寄存器都是16位的,可以存放两个字节。 知识点2:寄存器中的数据存储 一个16位寄存器可以存储一个16位的数据。例如,AX...
- **源变址寄存器 (SI)** 和 **目的变址寄存器 (DI)**:这两个寄存器常用于处理字符串和其他类型的数据序列。 ##### 2. 指令 指令是汇编语言的核心组成部分,它们告诉CPU如何执行特定任务。每条指令通常包含一个...
此外,还有变址寄存器SI和DI,以及指针寄存器SP和BP,它们在处理内存地址和堆栈操作时发挥重要作用。SP指示栈顶位置,BP则常用于表示堆栈段中的基地址。指令指针寄存器IP用于指示代码段中的指令偏移地址,配合CS...
- `MOV SI, 0`:设置源索引寄存器SI为0。 - `MOV DI, 0`:设置目的索引寄存器DI为0。 - `MOV CX, 26`:设置计数器CX为26。 5. **循环复制逻辑**: ```asm LLL: MOV AL, S1[SI] ; 将S1[SI]处的值读入AL寄存器 ...
数据寄存器有 AX、BX、CX、DX 等,地址寄存器有 SP、BP、SI、DI 等,段寄存器有 CS、SS、DS、ES 等,专用寄存器有 IP、FLAGS 等。 数据寄存器可以以字的方式访问,也可以以字节的方式访问。例如,AX 寄存器可以分为...
- 间址寄存器限制为SI、DI、BP和BX,其中BX、DI、SI对应数据段DS,BP对应堆栈段SS。 这些寻址方式是8086/8088汇编语言的基础,理解和掌握它们对于编写有效的汇编代码至关重要。通过灵活运用这些寻址模式,程序员...