鱼C论坛

 找回密码
 立即注册
查看: 2371|回复: 1

[技术交流] 关于王双监测点6.1的一点个人见解

[复制链接]
发表于 2012-4-22 11:26:19 | 显示全部楼层 |阅读模式

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

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

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

分析完了哦,亲,如果还有什么疑问请留言。其他分析的不对的地方也请各路大神指正!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-2-12 19:14:34 | 显示全部楼层
不错不错,顶一顶!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-18 02:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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