鱼C论坛

 找回密码
 立即注册
查看: 8729|回复: 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 中,请认真进行调试,然后写上你的分析过程,没有分析过程的答案即使正确,也不会采纳。
  1. assume cs:codesg

  2. codesg segment

  3.         dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

  4.         dw 0,0,0,0,0,0,0,0,0,0

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

  6.         mov ss,ax

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

  8.         mov ax,0

  9.         mov ds,ax

  10.         mov bx,0

  11.         mov cx,8

  12.     s:  push [bx]

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

  14.         add bx,2  

  15.         loop s

  16.         mov ax,4c00h

  17.         int 21h

  18. codesg ends

  19. end start


复制代码



小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-4-8 10:32:57 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-4-7 19:34:51 | 显示全部楼层
wAterLoo 发表于 2012-4-7 19:12
很抱歉,这个题目临时想的

你那个为0的答按 理论上能行,不过我没试过,

喔明白了   不再纠结了 谢版主!~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-4-7 19:12:53 | 显示全部楼层
莫名其妙 发表于 2012-4-7 18:15
喔 原来如此 我说题目重点说的调试模式是个啥意思呢 原来是 -t pushf push cs ip
没有debug 没有-t 就 ...

很抱歉,这个题目临时想的

你那个为0的答按 理论上能行,不过我没试过,
不知道你执行的时候成功了没!
不过题目本身的意义不在于答按,而是希望大家能够思考这个问题
我也是偶然发现的,在debug下,按t ,push进去的数据,前面老是有几个数据被覆盖
不过仔细去看 却发现 前面3个字单元存储的恰好是 cs,ip,还有标志寄存器的值
由此才想到 汇编的中断机制
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-4-7 18:15:35 | 显示全部楼层
本帖最后由 莫名其妙 于 2012-4-7 18:27 编辑
梅梁馨 发表于 2012-3-31 22:52
赞成的顶一下
1.
这题汇编是两个答案:12H和18H.


喔 原来如此 我说题目重点说的调试模式是个啥意思呢 原来是 -t pushf push cs ip
没有debug 没有-t 就没有这些多出来的数据  !~  
我以前说的那些乱七八糟的答案原来都是不合题意的!~
不过还有一点 12h 就不能在调试模式下得出答案了吧!~那结果不是还是18h么?

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-4-5 21:13:15 | 显示全部楼层
研究了很长时间了额,还是不懂。求解!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-4-5 16:01:21 From FishC Mobile | 显示全部楼层
本帖最后由 离尘※影 于 2012-4-5 16:21 编辑

CS:0~15需要保存结果,理论sp应该为11h,如果不考虑栈溢出,可以为0
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-4-5 12:45:59 | 显示全部楼层
炫动少年 发表于 2012-4-4 23:23
可是如果这样的话,pop 之后 sp-2 就不是负数了?
还有就是在执行的过程中原数据这样不会遭到破坏吗?
...

前面的问题我也不是很清楚,但是这道题并没有在操作定义的数据,所以直接覆盖就行了。。。不用考虑是否破坏原来的数据。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-4-5 08:59:07 | 显示全部楼层
8h  凑个热闹
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-4-5 08:29:59 | 显示全部楼层
本帖最后由 莫名其妙 于 2012-4-5 08:33 编辑
炫动少年 发表于 2012-4-4 23:23
可是如果这样的话,pop 之后 sp-2 就不是负数了?
还有就是在执行的过程中原数据这样不会遭到破坏吗?
...

版主所说的思维障碍我的想法就是 关于 题目只是要求 结果没说相对数据是否存储进去或者被破坏的问题!~

关于sp-2 问题 我前面也说了书上的问题3.12 (第3章69页)关于栈段的一些介绍  用push pop 只修改sp的值      用push一直压栈会导致栈顶环绕覆盖原栈内数据 所以 sp=0-2 以后会得到 sp=fffe
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-4-4 23:23:26 | 显示全部楼层
莫名其妙 发表于 2012-4-1 21:34
对不起 在版主没公布正确答案前我坚持我的答案
而且我并不是没有动手测试就发表评论 我相信每个人都有 ...

可是如果这样的话,pop 之后 sp-2 就不是负数了?
还有就是在执行的过程中原数据这样不会遭到破坏吗?
求解!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-4-4 23:22:43 | 显示全部楼层
agittarius 发表于 2012-4-4 22:40
答案是0吧,开始认为是12h,以为在dw 0,0,....处取一个空间作为栈保存数据的地方就行了,后来因为题目中说的 ...

可是如果这样的话,pop 之后 sp-2 就不是负数了?
还有就是在执行的过程中原数据这样不会遭到破坏吗?
求解!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-4-4 23:12:28 | 显示全部楼层
根据12楼的提示,还是有些疑惑,楼主说  要点中有   中断机制,
cpu在执行int n(int21h的时候也要吗?)中段的时候要 标志寄存器入栈,cs,ip 入栈  这要3个字
12楼说的pop的时候要iret这个不清楚
希望楼主能解答!还有多出些这样的题目,虽然这题目我答不上了:'(
支持鱼c!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-4-4 22:40:54 | 显示全部楼层
答案是0吧,开始认为是12h,以为在dw 0,0,....处取一个空间作为栈保存数据的地方就行了,后来因为题目中说的是将0:0-0:15空间中的数据复制到cs:0-15中,所以,原来空间中的数据就不在需要了,于是我认为是2h,但是这个调试不过去,看了上面他们的答案,发现0是正确的,但是还是不是很明白,就解释。。。:P
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-4-1 23:38:35 | 显示全部楼层
期待结果。。学习:Q
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-4-1 22:14:20 | 显示全部楼层
莫名其妙 发表于 2012-4-1 21:34
对不起 在版主没公布正确答案前我坚持我的答案
而且我并不是没有动手测试就发表评论 我相信每个人都有 ...

呵呵,不好意思哈,是我失态~~~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-4-1 21:34:43 | 显示全部楼层
本帖最后由 莫名其妙 于 2012-4-1 21:38 编辑
一世芳华 发表于 2012-4-1 19:02
你分析这么多有意义吗? sp小于8h,调试的时候就会报错。。还0呢~~动手才是王道,想破脑袋不如动手试试~~ ...


对不起 在版主没公布正确答案前我坚持我的答案
而且我并不是没有动手测试就发表评论 我相信每个人都有自己的想法 有自己的计算结果 不管结果正确与否
我并不针对别人的结果发表什么看法 最多也就算互相讨论下 毕竟自己和别人的想法不一定一样

-dds:0 f
0000:0000  68 10 A7 00 BB 13 02 0E-16 00 B6 03 B1 13 02 0E
0000:0010  8B 01 70 00 B9 06 1B 02-40 07 1B 02 FF 03 1B 02
-d cs:0 f
1403:0000  68 10 A7 00 BB 13 02 0E-16 00 B6 03 B1 13 02 0E
1403:0010  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-4-1 20:35:00 | 显示全部楼层
梅梁馨 发表于 2012-4-1 20:26
讨论一下:
1.以字为单位的时候,什么情况下指针会在11的奇数位置?
2.我认为是Debug中才能看到标志位.这是 ...

1、这是SP1。。。打比方来的,并不是真正的SP~~并且,即使指向奇数位,也是没有问题的;
2、标志位在控制台中有8个,由于只有0或1,因此是字节,不过,不管是字还是字节~,由于是存在栈内,SP每次移动2个内存单元,所以每个标志位占一个字的空间,空的部分用0填充,即两个字节单元;
3、这个sp不能低于8个字节单元的情况我实验过, 低于8的时候,调试就会报错,我也不知道原因在哪里,估计是系统设置吧~~~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-4-1 20:26:20 | 显示全部楼层
本帖最后由 梅梁馨 于 2012-4-1 20:33 编辑
一世芳华 发表于 2012-4-1 19:45
SP最小值为28h。
我们假设SP=SP1+SP2+SP3;
1、由于要复制的是字型数据,且SP每次-2,因此,SP1=f+2=11; ...


讨论一下:
1.以字为单位的时候,什么情况下指针会在11的奇数位置?
2.我认为是Debug中才能看到标志位.这是小问题,主要是flag是什么?占几个什么单元?
3.sp最小值为8H,这个栈无缘无故就空这么多在这里?
:lol
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-4-1 19:49:27 | 显示全部楼层
梅梁馨 发表于 2012-4-1 16:35
16h只能8个进栈,7个出栈,这样cx=8就没意义了

肤浅,真正用来传送数据的栈空间只有一个字的空间就够了,用完下一次就用新的数据覆盖了。。
小甲鱼最新课程 -> https://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.
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-29 04:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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