鱼C论坛

 找回密码
 立即注册
查看: 2698|回复: 8

检测点6.1

[复制链接]
发表于 2019-7-16 11:10:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
检测点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,[bx]

         mov cs:[bx],ax {填空处}

        add bx,2

        loop s

        mov ax,4c00h

        int 21h

codesg ends

end start
这题是什么意思啊,dw的那8个字不是都放在cs中了吗,为什么后面的loop循环还往cs里面放。。。?
是我对题目的理解有问题吗
请问答案网速慢不是
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-7-16 11:16:19 | 显示全部楼层
我看视频的时候cs:codesg意思不就是 dw中定义的字都存储在cs中吗?
cs中的0,2,4,6,8,A以此类推都是那八个字的地址啊 为什么还要从新覆盖上?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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,[bx] ;把段地址等于0,偏移地址等于0的数据给ax

         mov cs:[bx],ax {填空处};因为程序是要用指定的八个字数据来更改程序0-15的内容,那么程序段就是CS,所以这段就是将第一个字数据覆盖程序段第一个字的数据

        add bx,2                          ;更改变量BX的内容

        loop s                            ;循环

        mov ax,4c00h

        int 21h

codesg ends

end start

你应该是题目理解不透。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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中?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-18 12:54:19 | 显示全部楼层
这道题的意思是,把内存中0:0~0:15的内容覆盖到程序定义的dw的段的地址里
dw后面的8个字是存放在cs段中的,0~15这些位置就是存放dw后的8个字
看到mov ax,[bx]就是取出ds:bx中的内容,而dx:bx对应的就是0000:0000这个内存单元,前面已经有赋值了,然后把取出来的数给ax,再mov cs:[bx],ax,把取出来的数给cs段的第一个字地址,也就是dw后面的第一个字

首先,我们查看cs:0的内容
2019-07-18_124337.png
可以看到cs:0的值就是dw中的值

然后我们执行程序,然后查看0:0和cs:0中的内容
2019-07-18_125225.png
我们发现,0:0中的内容拷贝到了cs:0中去了,完成

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

意思就是假设cs是codesg的地址不是默认从0开始 是从psp后面的地址开始对吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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个字节的数据是存放的数据
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-31 15:54:37 | 显示全部楼层
你弄错了
定义了 DS 的数据 所以  留出了 一段内存给了 DS
所以 DS 不等于 CS
CS 的 开始 地址 是看  END (标号) 的地址 为CS的 入口地址
所以 是吧DS 的数据段 放在 CS 段中 更改CS段的意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 09:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表