汇编语言 程序运行后关于DS段寄存器的问题:

作者&投稿:庞府 (若有异议请与网页底部的电邮联系)
汇编语言关于ds的问题~

ds是段寄存器,是用来存储段地址的,程序是通过段地址:偏移地址寻找数据地址的。mov 1000,al是错误的,al是寄存器,1000是数据,不能mov啊,只有内存地址或寄存器才能啊,例如mov [1000],al这样就可以

段寄存器的值不能由寄存器以外的其他方式获取,X86就是这么规定的
所以一定要先读入AX,再从AX复制到DS

程序加载后,ds中存放着程序所在内存区的段地址,而cs中的是代码段的开头段地址,默认便宜地址都是为0
0b2d:0000到0b3d:0000这段空间是256字节,是PSP区,是用来让程序和dos进行通信的
另外最好不要在code segment中定义数据,不然会吧数据当成代码运行
可以另起一个data segment来定义数据

16位可执行文件被加载到内存,整个加载文件模块前有个系统自动加载的PSP,其起始地址为ds:[0],psp占256字节,可执行程序映像起始地址为(ds+10h):0。即cs=ds+10h。

您说的“从0b2d:0000到0b3d:0000这段空间是16个字节”是错的,0b2d:0000到0b3d:0000有257字节。从0b2d:0000到0b2d:00ffh有256字节,即系统加载的PSP.。一般不用理会,您如果非要搞清楚可百度程序段前缀PSP。
程序影像起始地址为0b3d:0000,即从0b3d:0000开始的到0b3d:0010 的16个字节是存放程序开始定义的那八个数。

由于本人工作环境不是8086架构,故而对于本人以下言论楼主应该持有保留态度。

DS 和 CS都是段寄存器,分别是数据段寄存器和代码段寄存器,两者之间也没有什么必然的联系。
程序源码中也没有试图主动修改这两个段寄存器(代码段基址寄存器的改变要通过跳转指令),故而结束后是系统初始化时的段基址值。
DS和CS所指定的内存区域也没有必然的连续性。

谬误之处还请指正。

学习。。。


古蔺县17222943756: 汇编语言关于ds的问题 -
段干福博卡: ds是段寄存器,是用来存储段地址的,程序是通过段地址:偏移地址寻找数据地址的.mov 1000,al是错误的,al是寄存器,1000是数据,不能mov啊,只有内存地址或寄存器才能啊,例如mov [1000],al这样就可以

古蔺县17222943756: 求助!汇编语言 将段地址填写到段寄存器的具体方法问题! -
段干福博卡: DATA是一个数 DS是数据段寄存器.不能对段寄存器直接给值(立即数).同理,对于其它段寄存器一样不可直接操作〔给值(立即数〕).一个例子:源代码: mov ax,@data mov ds,ax 编译后 -u 0BF2:0000 B8F30B MOV AX,0BF3 0BF2:0003 8ED8 MOV DS,AX

古蔺县17222943756: 汇编语言的CS是什么意思 -
段干福博卡: 汇编语言cs:是代码段寄存器,ds是数据段寄存器.段代码CS:存放当前正在运行的程序代码所在段的段基值,表示当前使用的指令代码可以从该段寄存器指定的存储器段中取得,相应的偏移值则由IP提供.cs:[ip]一起决定了下一条指令的地址,在调用的时候,CALL指令将保存返回地址,调用结束时,RET指令将恢复返回地址. 如果是段内跳转,则只需要修改IP,如果是远跳转,则需CS和IP同时修改和恢复. CS 代码段,或代码选择器.同IP寄存器(稍后介绍)一同指向当前正在执行的那个地址.处理器执行时从这个寄存器指向的段(实模式)或内存(保护模式)中获取指令.除了跳转或其他分支指令之外,无法修改这个寄存器的内容.

古蔺县17222943756: 汇编语言8086的一个问题,程序如下,为什么我执行程序后str1是从ds 0200h开始存储的? -
段干福博卡: 最好用串操作指令来完成.;数据段从100H开始存放字符串str1,从200H开始存放str2,;二者均以NULL字符为结束符,;编写程序将str2拷贝到str1末尾 ASSUME CS:CODE, DS:DATA DATA SEGMENT PARA ORG 0100H STR1 DB 0DH, 0...

古蔺县17222943756: 新手汇编里关于4个段寄存器的问题 -
段干福博卡: 嘿嘿 还是俺来帮你解答吧1 cs是存放程序段首地址的寄存器 该段地址从CS*16开始 有64K空间可以存放用户的程序代码 比如 MOV AX,267 这条指令 就是存在从CS*16开始的代码段中的.267是指令中的操作数 和指令是一体的 都存在代码段中...

古蔺县17222943756: 在汇编语言的串操作中, MOV DI, DS MOV ES, DI 这两条指令到底有什么作用? -
段干福博卡: (1)这两条指令没有上下文的情况下,无法为您判断它们的实际意义.看不出与串操作有什么直接关系.在串操作中,一般是将两个串分别放在DS:SI和ES:DI寻址的内存单元中,以方便于串的比较、移动等操作.(2)mov si,ds指令的意义是:将数...

古蔺县17222943756: 在汇编语言中,段和段寄存器的关系?谁能给我详细的解释解释?并且解释下什么什么叫段? -
段干福博卡: 段就是程序的一部分,不如说数据段,代码段,分别存放数据和代码 例如 DATA SEGMENT ABC DB "THIS IS A variable" DATA ENDS CODE SEGMENT START: MOV AX,DATAMOV DS,AX.......MOV AX,004CHINT 21H CODE ENDS ...

古蔺县17222943756: 关于汇编语言中的寄存器 -
段干福博卡: 这么专业,干吗不看书啊?数据寄存器分累加器,和普通寄存器.累加器保存计算结果,普通寄存器保存数据.代码段当然是保存当前运行的代码的;数据段保存当前程序的数据;堆栈段保存子程序调用时的返回地址和程序参数(地址);附加段也保存数据,不过一般保存批量计算的结果.

古蔺县17222943756: 汇编语言PSP知识
段干福博卡: 一般来说,PSP是256个字节,当程度生成了可执行文件以后,在执行的时候,先将程序调入内存,这个时候DS中存入程序在内存中的段地址,紧接着是程序的一些说明,比如说程序占用多大空间等等,这就是PSP,一般PSP占256个字节,然后才是真正的程序地址,将CS指向这里,IP设为0000,为什么一般CS要比DS大10H,就是因为这个原因,简单说:DS存放的是程序段地址,由于PSP的存在,真正要执行的地址是DS再加上256个字节,真正的地址是DS*16+256化简一下:DS*16+0+16*16=16*(DS+16)真正的地址又可以写成:cs*16+0 所以CS相当于DS+16,化成十六制是DS+10

古蔺县17222943756: 汇编语言比较三个数大小 -
段干福博卡: 答:楼主程序有三个语法错误: 错误1:没有初始化段寄存器DS,ASSUME仅仅是把DSEG与DS寄存器关联,并没有把数据段的段基址存入段寄存器DS中,因此要加入语句:"MOV AX,DSEG MOV DS,AX"; 错误2:因为本程序中的DATE...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网