鱼C论坛

 找回密码
 立即注册
查看: 7246|回复: 38

考验大家汇编的基本功

  [复制链接]
发表于 2012-3-31 22:52:30 | 显示全部楼层 |阅读模式
50鱼币
本帖最后由 wAterLoo 于 2012-4-1 15:11 编辑

为了让大家重视汇编基础的重要性,而不是走马观花的把教学视频过一遍,特推出基本功大考验,让大家重视基础!!!!!!!!
题目由《王爽汇编语言》检测点6.2改编
这个题目考验大家对,中断机制和堆栈知识的了解
补充:这里还有一个思维的小障碍:lol

原题目:下面的程序实现依次用内存0:0~0:15单元中的内容改写程序中的数据,数据的传送用栈来进行。栈空间设置在程序内

变化:请在____处填入一个最小的值,使得这段程序能够在debug的调试模式下(请注意,是调试模式),能够正常的用内存0:0~0:15单元中的内容改写程序中的数据,也就是把 数据段 0:0~0:15,的数据 复制到 cs:0~cs:15 中,请认真进行调试,然后写上你的分析过程,没有分析过程的答案即使正确,也不会采纳。
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 

start:  mov ax, codesg ;或mov ax, cs 

        mov ss,ax 

        mov sp, ____   ; sp的值最小能设置多少?

        mov ax,0 

        mov ds,ax 

        mov bx,0 

        mov cx,8 

    s:  push [bx] 

         pop cs:[bx]   ;或 pop ss:[bx] 

        add bx,2  

        loop s 

        mov ax,4c00h 

        int 21h 

codesg ends 

end start


最佳答案

查看完整内容

赞成的顶一下 1. 这题汇编是两个答案:12H和18H. 符合楼主要求的是18H,什么要求?就是那个括号里面的:调试模式. 如果不需要调试,就是12H.(仅限于本程序,程序中没有中断指令且int 21h不影响其结果) 2 为什么? 先从中断机制说起,每条汇编指令执行完后都提供了一个中断的机会(mov ss,ax除外,它和SP赋值是相关联的),这个机会就看我们用不用它了. 如果中断大致会做以下事情: 判断是哪种中断-保存当前信息-跳到对应的处理程序运行 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-3-31 22:52:31 | 显示全部楼层
本帖最后由 梅梁馨 于 2012-4-6 12:04 编辑

赞成的顶一下
1.
这题汇编是两个答案:12H和18H.
符合楼主要求的是18H,什么要求?就是那个括号里面的:调试模式.
如果不需要调试,就是12H.(仅限于本程序,程序中没有中断指令且int 21h不影响其结果)
2
为什么?
先从中断机制说起,每条汇编指令执行完后都提供了一个中断的机会(mov ss,ax除外,它和SP赋值是相关联的),这个机会就看我们用不用它了.
如果中断大致会做以下事情:
判断是哪种中断-保存当前信息-跳到对应的处理程序运行-回到当前程序
回到本程序,在mov ax,4c00h  int 21h 退出程序之前的哪一条指令是让程序中断的?答案是没有.
到底是谁让程序中断的呢?
就是Debug,这就是上面说的调试模式,在Debug中运行每条指令后,都中断一次,即单步中断.
3.中断后要去别的地方执行,完了后要回到我们的程序中,就要把当前信息保存起来.
保存的信息有:flag,cs,ip,它们就保存在栈中了.相当于:
pushf
push cs
push ip
到哪去执行中断处理程序:单步中断的类型码为1,就到它的向量表中提取CS和IP,转到其指向的地址执行处理程序
怎么回到我们的程序:从栈中取刚才保存的信息就回到程序中.相当于iret,即:
push ip
push cs
pushf
4.综上所述,调试模式下栈的空间要留出3个字单元以存放我们程序的现场信息,还加上一个要通过栈空间中转的字单元.
5.最后解释下12H,那就是不进入调试中断模式,就不需要保存现场信息的3个字节的栈空间咯.

这样说希望能看懂.注意的是代码存放空间不要和栈空间冲突.
参考12楼.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-4-1 08:28:39 | 显示全部楼层
木人回复?!小弟不才,sp的值最小能设置多少? 我觉得是10h。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-4-1 08:36:51 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-4-1 08:41:48 | 显示全部楼层
本帖最后由 矛灬盾 于 2012-4-1 08:45 编辑

s:  push [bx]

24.

25.         pop cs:[bx]   ;或 pop ss:[bx]

26.

27.        add bx,2  

28.

29.        loop s

通过上面的这个loop循环可以看出,其功能是把ds:[bi]的数据放入到cs:[bi]中、而这个过程它是靠栈的推入与推出实现的,通过入栈和出栈的过程(sp的变化)不难看出这个过程只要占用一个字的空间就可以实现,一次循环结束后sp的位置没有发生变化,而后循环进行。(这时候数据段cs和栈段ss是同一位置
同时为了将ds中的八个数据复制到cs中,cs/ss的前16个字节空间(0--15)是目的地址空间,则sp可以指向以后的空间地址,最小是16,十六进制10h。。解释完毕。。
这是我自己的理解,,望各位指点。。不吝赐教。。:lol
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-4-1 08:44:30 | 显示全部楼层
wAterLoo 发表于 2012-4-1 08:36
不要觉得,去调试看看,会有大发现

我用10h调试了。可以实现复制功能。。不知道你说的大发现是?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-4-1 08:46:57 | 显示全部楼层
矛灬盾 发表于 2012-4-1 08:44
我用10h调试了。可以实现复制功能。。不知道你说的大发现是?

你复制的数据成功了,你去看看cs:0 f  和 ds:0 f 的数据相同么!!!!

不给提示了,否则没悬念了!!!!!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-4-1 09:46:30 | 显示全部楼层
wAterLoo 发表于 2012-4-1 08:46
你复制的数据成功了,你去看看cs:0 f  和 ds:0 f 的数据相同么!!!!

不给提示了,否则没悬念了!! ...

前八个字节空间数据内容是一样的、、后八个。。不一样。。但我换成20h后就完全一样了,这是何故。我前面的解释哪地方错来,不解。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-4-1 11:18:48 | 显示全部楼层
这个sp是24h.分析如下代码段的前16个字节定义了数据偏移地址为0-15  。代码段的后20个字节定义了空间16-35此空间当做堆栈段使用所以sp应该从36开始。已经很详细了。请给鱼币。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-4-1 12:01:15 | 显示全部楼层
嗜睡王子 发表于 2012-4-1 11:18
这个sp是24h.分析如下代码段的前16个字节定义了数据偏移地址为0-15  。代码段的后20个字节定义了空间16-35此 ...

把sp(24)的值减小,你调试下,看下结果。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-4-1 12:02:34 | 显示全部楼层
嗜睡王子 发表于 2012-4-1 11:18
这个sp是24h.分析如下代码段的前16个字节定义了数据偏移地址为0-15  。代码段的后20个字节定义了空间16-35此 ...

I‘m sorry, 要最小的SP;P
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-4-1 12:04:10 | 显示全部楼层
矛灬盾 发表于 2012-4-1 09:46
前八个字节空间数据内容是一样的、、后八个。。不一样。。但我换成20h后就完全一样了,这是何故。我前面的 ...

;P 好好想想吧 ,都是书上的知识点哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-4-1 14:47:34 | 显示全部楼层
本帖最后由 梅梁馨 于 2012-4-5 11:52 编辑

18H
pop取出数据时也要做IRET
前8个字单元存放复制数据
还原标志寄占1个字单元,LOOP位移先要取出IP占1个字单元,CS占1个字单元,
这里入栈后马上就出栈,只要1个字单元.
共12个字单元,sp指向18H.
;P

评分

参与人数 1鱼币 +3 收起 理由
wAterLoo + 3 已经接近了

查看全部评分

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

使用道具 举报

发表于 2012-4-1 15:48:11 | 显示全部楼层
这个题目,SP最小能设置多少,我专门研究过了,嘿嘿,先不说,看有没有人知道。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-4-1 16:23:46 | 显示全部楼层
本帖最后由 莫名其妙 于 2012-4-1 17:45 编辑

最小是0

开始我以为是18h 当一个栈设定好了sp也指向以后 栈内就已经保存着 当前的cs ip了 要空出CS IP这个位置所以得出结果是18h
而后面我在网上找关于栈设定好后为什么里面会保存着CS IP数据的时候发现一句话
这句话是网上的(但在实模式下,因为处理器没有堆栈保护机制,所以,堆栈溢出是一个人为的概念,实际不存在所谓溢出不溢出)
然后我就感觉到了点什么.
书上的问题3.12 (第3章69页)关于栈段的一些介绍  用push pop 只修改sp的值      用push一直压栈会导致栈顶环绕覆盖原栈内数据
所以sp=0时 当使用 push操作会导致栈顶环绕    pop 又能返回环绕前的位置  而且不会影响本题所要的结果  所以 0应该是最小的!~

希望版主介绍一下  关于栈建立起来以后里面保存着cs ip还有个数据  这个cs和ip 是当前指令行cs:ip 的值  而且还有个数据不知道是什么难道是 flag ?
那是不是可以说代码段 栈段在同一段的话  栈建立起来以后 就时刻保存着 每段代码的cs:ip flag? 求解惑!~

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

使用道具 举报

发表于 2012-4-1 16:35:43 | 显示全部楼层
16h只能8个进栈,7个出栈,这样cx=8就没意义了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-4-1 16:40:03 | 显示全部楼层
顶!!!!!!!!!!!!!!!!!!!!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-4-1 18:37:43 | 显示全部楼层
看不懂,,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-4-1 19:02:34 | 显示全部楼层
莫名其妙 发表于 2012-4-1 16:23
最小是0

开始我以为是18h 当一个栈设定好了sp也指向以后 栈内就已经保存着 当前的cs ip了 要空出CS IP这 ...

你分析这么多有意义吗? sp小于8h,调试的时候就会报错。。还0呢~~动手才是王道,想破脑袋不如动手试试~~{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-4-1 19:45:27 | 显示全部楼层
本帖最后由 一世芳华 于 2012-4-1 19:52 编辑

SP最小值为28h。
我们假设SP=SP1+SP2+SP3;
1、由于要复制的是字型数据,且SP每次-2,因此,SP1=f+2=11;
2、我们在CMD窗口中可以看到标志寄存器:NV UP EI PL NZ NA PO NC,共8个,由于代码中有ADD指令及循环,所以要保护S的现场才能真正的循环,因此要用栈保存标志寄存器,保护现场,因此SP2=8*2=16 ,0~15,即16进制为F;
3、经过实验我们知道,SP最小值为8H,低于8H调试运行的时候就会报错,可能是系统的设计,所以SP3=8;

综上所述,SP=SP1+SP2+SP3=11+F+8=28H.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-20 00:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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