SI和DI寄存器的用途

2024-03-05 03:48
文章标签 di 寄存器 si

本文主要是介绍SI和DI寄存器的用途,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


SI是源变址寄存器,DI是目的变址寄存器。可以用来存放数据、地址,功能类似、用法类似、一般使用哪个都可以。

但需要注意的是:在串处理指令中,SI用作隐含的源串地址,默认在DS中;DI用做隐含的目的串地址,默认在ES中;此时不能混用。

BP: 是和堆栈指针SP联合使用的,作为SP校准使用的,只有在寻找堆栈里的数据和使用个别的寻址方式时候才能用到比如说,堆栈中压入了很多数据或者地址,你肯定想通过SP来访问这些数据或者地址,但SP是要指向栈顶的,是不能随便乱改的,这时候你就需要使用BP,把SP的值传递给BP,通过BP来寻找堆栈里数据或者地址.


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+si]和[bx+di]

在前面我们用[bx(si或di)]和[bx(si或di)+idata]的方式来指明一个内存单元,我们还可以用更为灵活的方式:[bx+si]和[bx+di].

[bx+si]和[bx+di]的含义相似,我们以[bx+si]为例进行讲解.

[bx+si]表示一个内存单元,它的偏移地址为(bx)+(si)(即bx中的数值加上si中的数值).

我们看一下指令mov ax,[bx+si]的含义:

将一个内存单元的内容送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址后为bx中的数值加上 si中的数值,段地址在ds中.

数学化的描述为:(ax)=((ds)*16+(bx)+(si))

该指令也可以写成如下格式(常用):

mov ax,[bx][si]

用DEBUG查看内存:

d 2000:1000

写出下面的程序执行后,ax,bx,cx中的内容.

mov ax,2000H

mov ds,ax

mov bx,1000H

mov si,0

mov ax,[bx+si]

inc si

mov cx,[bx+si]

inc si

mov di,si

add cx,[bx+di]

分析

mov ax,[bx+si]

访问的字单元的段地址在 ds中,(ds)=2000H;偏移地址=(bx)+(si)=1000H;指令执行后(ax)=00BEH

mov cx,[bx+si]

访问的字单元的段地址在ds中,(ds)=2000H;偏移地址=(bx)+(si)=1002H;指令执行后(cx)=0600H

add cx,[bx+di]

访问的字单元的段地址在ds中,(ds)=2000H;偏移地址=(bx)+(di)=1002H;指令执行后(cx)=0606H

                                [bx+si+idata]和[bx+di+idata]

[bx+si+idata]和[bx+di+idata]的含义相似,我们以[bx+si+idata]为例进行讲解.

[bx+si+idata]表示一个内存单元,它的偏移地址为(bx)+(si)+idata(即bx中的数值加上si中的数值再

加上idata).

我们看一下指令mov ax,[bx+si+idata]的含义:

将一个内存单元的内容送入ax,这个内存单元长度为2字节(字单元),存放一个字,偏移地址为bx中的数值加上si中的数值在加上idata,段地址在ds中.

数学化的描述为:(ax)=((ds)*16+(bx)+(si)+idata)

该指令也可以写成如下格式(常用):

mov ax,[bx+200+si]

mov ax,[200+bx+si]

mov ax,200[bx][si]

mov ax,[bx].200[si]

mov ax,[bx][si].200

用DEBUG查看内存:

d 2000:1000

写出下面的程序执行后,ax,bx,cx中的内容.

mov ax,2000H

mov ds,ax

mov bx,1000H

mov si,0

mov ax,[bx+2+si]

inc si

mov cx,[bx+2+si]

inc si

mov di,si

mov bx,[bx+2+di]

分析:

mov ax,[bx+2+si]

访问的字单元的段地址在ds中, (ds)=2000H;偏移地址=(bx)+(si)+2=1002H;指令执行后(ax)=0006H

mov cx,[bx+2+si]

访问的字单元的段地址在ds中,(ds)=2000H;偏移地址=(bx)+(si)+2=1003H;指令执行后(cx)=6A00H

mov bx,[bx+2+di]

访问的字单元的段地址在ds中,(ds)=2000H;偏移地址=(bx)+(di)+2=1004H;指令执行后(bx)=226AH


这篇关于SI和DI寄存器的用途的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/775233

相关文章

寄存器B

MCS-51单片机的中央处理器包含运算部件和控制部件两部分。         1. 运算部件         运算部件以算术逻辑运算单元ALU为核心,包含累加器ACC、B寄存器、暂存器、标志寄存器PSW等许多部件,它能实现算术运算、逻辑运算、位运算、数据传输等处理。         算术逻辑运算单元ALU是一个8位的运算器,它不仅可以完成8位二进制数据加、减、乘、除等基本的算

士兰微 SC32F5432 通过配置寄存器方式 将管脚配成开漏输出模式和TTL输入模式

目录 前言: 士兰微电子介绍 士兰微 SC32F5432介绍 士兰微 SC32F5432 通过配置寄存器方式 将管脚配成开漏输出模式和TTL输入模式 开漏输出模式 TTL输入模式 前言: 下面是对我在工作时公司所使用的一款国产芯片(士兰微 SC32F5432)开发过程所遇到的一些问题的记录与解决。 士兰微电子介绍 杭州士兰微电子股份有限公司(600460)坐落于杭州

笔记 14 : 彭老师课本第 8 章, UART : 寄存器介绍 ,

(99) 继续介绍 uart 的关于通道的 一整套 寄存器, UCON 等: ++ 接着介绍寄存器 UTRSTAT : ++ 接着介绍读写数据的寄存器: ++ 设置 uart 的波特率,有关的寄存器: ++ (100) (101) 谢谢

AUXR-特殊功能寄存器(只写)

AUXR : Auxiliary Register(只写) MnemonicAddbitB7B6B5B4B3B2B1B0Reset ValueAUXR8EHname -  -  - - - -EXTRAMALEOFFxxxx,xx00 禁止ALE信号输出(应用示例供参考,C语言):sfr AUXR = 0x8e; //声明AUXR寄存器的地址AUXR = 0x01;//ALEOFF位置1

FPGA编程基础(一)--参数传递与寄存器使用

一、参数映射 参数映射的功能就是实现参数化元件。所谓的”参数化元件“就是指元件的某些参数是可调的,通过调整这些参数从而可实现一类结构类似而功能不同的电路。在应用中,很多电路都可采用参数映射来达到统一设计,如计数器、分频器、不同位宽的加法器以及不同刷新频率的VGA视频接口驱动电路等。 参数传递 参数传递就是在编译时对参数重新赋值而改变其值。传递的参数是子模块中定义的parameter,其传递方

Spring(二):IOC和DI的理解

一、IOC和DI的理解         在平时的java应用开发中,我们要实现某一个功能或者说是完成某个业务逻辑时至少需要两个或以上的对象来协作完成,在没有使用Spring的时候,每个对象在需要使用他的合作对象时,自己均要使用像new object() 这样的语法来将合作对象创建出来,这个合作对象是由自己主动创建出来的,创建合作对象的主动权在自己手上,自己需要哪个合作对象,就主动去创建,创建合作

【软件逆向】第38课,软件逆向安全工程师之操作标志寄存器实例,每天5分钟学习逆向吧!

在这些实例学习中,我们使用汇编指令来操作标志寄存器,并根据标志寄存器的状态进行条件分支。这些操作对于编写高效的汇编程序以及理解程序的行为至关重要 实例 1:使用 PUSHF 和 POPF 保存和恢复标志寄存器状态 section .text global _start _start: ; 初始化 AL 寄存器 MOV AL, 0xFF ; 对 AL 寄存器进行加一操作,这将导致 AL 寄存器的

新路程------hi3516a 在应用层对寄存器的操作

由于在应用层没法用writel,所以参考himm.c写了一个设置,代码如下: void uart1_rtsn_high(void) {     void * pMem  = NULL;   pMem = memmap(0x201d0010, DEFAULT_MD_LEN);   *(U32*)pMem = 0xff; } 文件名是rs485.c,但是用arm-hisiv300-linux

【软件逆向】第30课,软件逆向安全工程师之(五)寄存器相对寻址,每天5分钟学习逆向吧!

寄存器相对寻址是汇编语言中的一种寻址方式,它结合了寄存器间接寻址和立即数偏移。在这种寻址方式中,操作数的有效地址是通过将一个寄存器的内容与一个固定的偏移量(立即数)相加来得到的。以下是关于寄存器相对寻址的详细信息: 寄存器相对寻址的特点: 操作数地址是寄存器内容与偏移量的和:有效地址是寄存器的内容加上一个固定的立即数偏移量。灵活且具体:提供了对特定内存位置的间接访问,同时允许通过改变寄存器的内

RTC(实时时钟)/BKP(备份寄存器

1 unix时间戳 2 时间戳转换函数 3  BKP(备份寄存器) 1 TAMPER引脚侵入事件  2  RTC校准时间 3 RST闹钟脉冲和秒脉冲         可以输出出来为其他信号提供  4 校准时钟,寄存器加输出RTC校准时钟   5 总结:3个功能只能同时使用一个 4 BKP基本结构 5  RTC框图   6  RTC硬件电路