检测点6.1
检测点6.1(1)下面的程序实现依次用内存0:0~0:15单元中的内容改写程序中的数据,完成程序:
assume cs:codesg
codesg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
start:mov ax,0
mov ds,ax
mov bx,0
mov cx,8
s:mov ax,
mov cs:,ax {填空处}
add bx,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start
这题是什么意思啊,dw的那8个字不是都放在cs中了吗,为什么后面的loop循环还往cs里面放。。。?
是我对题目的理解有问题吗{:10_266:}
请问答案网速慢不是 我看视频的时候cs:codesg意思不就是 dw中定义的字都存储在cs中吗?
cs中的0,2,4,6,8,A以此类推都是那八个字的地址啊 为什么还要从新覆盖上? 我也是刚学这个,我给你解释看看。
assume cs:codesg
codesg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h ;定义八个字的数据
start:mov ax,0 ;设置ax=0
mov ds,ax ;设置段地址=0
mov bx,0 ;设置变量BX=0
mov cx,8 ;设置循环八次,因为有八个字数据
s:mov ax, ;把段地址等于0,偏移地址等于0的数据给ax
mov cs:,ax {填空处};因为程序是要用指定的八个字数据来更改程序0-15的内容,那么程序段就是CS,所以这段就是将第一个字数据覆盖程序段第一个字的数据
add bx,2 ;更改变量BX的内容
loop s ;循环
mov ax,4c00h
int 21h
codesg ends
end start
你应该是题目理解不透。 yjcoke 发表于 2019-7-16 19:24
我也是刚学这个,我给你解释看看。
assume cs:codesg
assume cs:codesg不是已经假设codesg就是cs了吗,dw后面的8个字都是存储在cs的cs:0,cs:2,cs:4,cs:6,cs:8,cs;a 以此类推的地址的,这样重复覆盖好像没有意义吧 还是我理解的dw后面的8个字存放的地址有误 不在cs中? 这道题的意思是,把内存中0:0~0:15的内容覆盖到程序定义的dw的段的地址里
dw后面的8个字是存放在cs段中的,0~15这些位置就是存放dw后的8个字
看到mov ax,就是取出ds:bx中的内容,而dx:bx对应的就是0000:0000这个内存单元,前面已经有赋值了,然后把取出来的数给ax,再mov cs:,ax,把取出来的数给cs段的第一个字地址,也就是dw后面的第一个字
首先,我们查看cs:0的内容
可以看到cs:0的值就是dw中的值
然后我们执行程序,然后查看0:0和cs:0中的内容
我们发现,0:0中的内容拷贝到了cs:0中去了,完成
111话 发表于 2019-7-16 11:16
我看视频的时候cs:codesg意思不就是 dw中定义的字都存储在cs中吗?
cs中的0,2,4,6,8,A以此类推都是 ...
刚看完这节课,和你有同样的疑惑,看到题的时候就一脸懵逼:为啥用一模一样的数据重新覆盖呢?。。。
试着回答一下吧
DW定义的8个字型数据,存储的地址是从CS:0000H~CS:0015H
而题目要求的是用0:0~0:15去覆盖CS:0000H~CS:0015H
看题目懵逼的原因应该是假定了CS==0 暗pluto 发表于 2019-7-18 12:54
这道题的意思是,把内存中0:0~0:15的内容覆盖到程序定义的dw的段的地址里
dw后面的8个字是存放在cs段中 ...
意思就是假设cs是codesg的地址不是默认从0开始 是从psp后面的地址开始对吗? 111话 发表于 2019-7-18 20:29
意思就是假设cs是codesg的地址不是默认从0开始 是从psp后面的地址开始对吗?
不是不是,你很明显弄混了,psp,下面是百度对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
codesg就是cs段的地址(就是一个名称的赋值而已),因为我们dw了16个字节的数据,所以,ip是从10开始的,看我上面的图,第一条指令是从10开始的,前16个字节的数据是存放的数据 你弄错了
定义了 DS 的数据 所以留出了 一段内存给了 DS
所以 DS 不等于 CS
CS 的 开始 地址 是看END (标号) 的地址 为CS的 入口地址
所以 是吧DS 的数据段 放在 CS 段中 更改CS段的意思
页:
[1]