|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
1.需要了解的知识点:
(1)定义了一个“dw”的字型数据,它的存放到了哪里?
如果我们是在代码段(cs)中定义的"dw",那么程序运行时,它们的地址就是:cs:0、cs:2、cs:4......
(2)我们在程序开辟一段空间,至于它是什么段(数据、代码、栈),是由我们自己去人为决定的,即通过(数据段)ds:bx、(代码段)cs:ip、(栈)ss:sp来指定地址而定的
例如:
assume cs:codesg
codesg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw 0,0,0,0,0,0,0,0
start: mov ax,cs
mov ss,ax
mov sp,32
mov bx,0
mov cx,8
s: push cs,[bx]
add bx,2
loop s
mov bx,0
mov cx,8
s0: pop cs:[bx]
add bx,2
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
我们在代码中定义了8个字型数据,它们的数值都是0.这8个字型的值是多少,对我们的程序来说没有意义。我们用dw定义的这8个数据,程序加载后,将用16个字节的内存空间来存放它们,而这段内在空间是我们所需要的,程序将它用作栈空间,也就是说,我们定义这些数据的最终目的是通过它取得一定容量的内存空间,
而你要将这段内存作什么段来处理,是你自己决定的。
2.开始个人见解咯
assume cs:codesg
codesg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw 0,0,0,0,0,0,0,0,0,0 ;10个字单元用作栈空间
start:
mov ax,cs ;cs为所填第一空
mov ss,ax
mov sp,24h ;此条指令为所填第二空
mov ax,0
mov ds,ax
mov bx,0
mov cx,8
s:
push [bx]
pop cs:[bx] ;此条指令为所填第三空
add bx,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start
第一空,首先我们的“栈段”是定义在codesg segment代码段中的,所以我们ss的地址跟cs是一样的。(小甲鱼老师说的哦!)
第二空,说白了就是找栈底的问题了:
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h ------ 16个字节(cs:0~cs:e)
dw 0,0,0,0,0,0,0,0,0,0 ------ 20个字节(cs:10~cs:23)
从数据所占的字节来看,定义完两个dw后,程序已经开辟了36个字节(16+20)的连续数据空间,所以栈会指向下栈底的下一个元素,即24H了
第三空,即要理解
mov ax,0
mov ds,ax
mov bx,0
......
push [bx]
pop cs:[bx]
首先: push [bx]就相当于 push ds:[bx] ,也就是将题目中说的把内存 0:0~0:15中的内容通过loop依次入栈,之后 pop cs:[bx] 就是之栈中的内容依次出栈到 cs:[bx]处,即
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h的地址cs:0~cs:e
分析完了哦,亲,如果还有什么疑问请留言。其他分析的不对的地方也请各路大神指正! |
|