监测点 6.1 引发的 ‘血案’
检测点6.1(第119页)-------------------
(1)
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
小甲鱼详细分析:我们把循环内的程序解释下,mov ax, 和 mov cs:, ax 是将内存0:0到0:15单元的内容依次借通用寄存器ax之手改写程序中的数据。
我的疑问有以下几点:
血案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 ;设置 ds 为0
mov cx,8 ;循环次数
s: mov ax, ; 将(ds)复制给ax 即 ax=(ds)==0123h
mov cs:,ax ;将0123h 复制给 (cs:) 即 (cs:)==0123h 那还是没变啊,(cs:)本来就等于0123h因为dw是在代码的开头
add bx,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start
因此,引发出第二个血案 ...在一个月黑风高、阳光明媚的一个晚上...突然.......
血案2。这段代码 似乎没改变过 数据
应该写到DS段吧,取出来又放回去和没动一样 start: mov ax,0
mov ds,ax
mov bx,0 ;设置 ds 为0
mov cx,8 ;循环次数
s: mov ax, ;这里指向的是DS:即0:
dw 初始化的是CS中的数据而不是DS中的 dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
是CS中的数据,这个题目的意思是吧程序中dw初始化的数据放入内存中。
chenlin7978580 发表于 2011-10-7 21:58 static/image/common/back.gif
start: mov ax,0
mov ds,ax
mov bx,0 ;设置 ds 为0
那DS中的数据又是什么呢?
Love 梦想 发表于 2011-10-11 00:29 static/image/common/back.gif
那DS中的数据又是什么呢?
你通过在debug中输入-d ds:0 就可以查出 ds中原来的数据了 然后通过执行全部代码后会发现 cs中的数据被DS覆盖了。
首先要明白dw定义的是什么段地址的数据,因为assume cs:code 所以dw的数据是在cs:,cs:……里。
然后内存0:0~0:15又是什么段地址的数据呢?是ds的,数据段。
所以题目要求是用内存数据(ds)改写代码数据(cs)。
清楚没?不知道我说的你明白不。
不喜勿喷 chenlin7978580 发表于 2011-10-19 11:17 static/image/common/back.gif
你通过在debug中输入-d ds:0 就可以查出 ds中原来的数据了 然后通过执行全部代码后会发现 cs中的数据被DS ...
该楼正解!~~~~
{:5_108:}
页:
[1]