111话 发表于 2019-7-16 11:10:57

检测点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:}
请问答案网速慢不是

111话 发表于 2019-7-16 11:16:19

我看视频的时候cs:codesg意思不就是 dw中定义的字都存储在cs中吗?
cs中的0,2,4,6,8,A以此类推都是那八个字的地址啊 为什么还要从新覆盖上?

yjcoke 发表于 2019-7-16 19:24:26

我也是刚学这个,我给你解释看看。
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

你应该是题目理解不透。

111话 发表于 2019-7-16 21:33:06

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

暗pluto 发表于 2019-7-18 12:54:19

这道题的意思是,把内存中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中去了,完成

徒手拆高达 发表于 2019-7-18 16:34:15

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

111话 发表于 2019-7-18 20:29:55

暗pluto 发表于 2019-7-18 12:54
这道题的意思是,把内存中0:0~0:15的内容覆盖到程序定义的dw的段的地址里
dw后面的8个字是存放在cs段中 ...

意思就是假设cs是codesg的地址不是默认从0开始 是从psp后面的地址开始对吗?

暗pluto 发表于 2019-7-18 22:44:35

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个字节的数据是存放的数据

huzhibin360 发表于 2019-7-31 15:54:37

你弄错了
定义了 DS 的数据 所以留出了 一段内存给了 DS
所以 DS 不等于 CS
CS 的 开始 地址 是看END (标号) 的地址 为CS的 入口地址
所以 是吧DS 的数据段 放在 CS 段中 更改CS段的意思
页: [1]
查看完整版本: 检测点6.1