鱼C论坛

 找回密码
 立即注册
查看: 9992|回复: 22

[技术交流] 实验5第5题Debug过程个人总结贴

[复制链接]
发表于 2011-4-12 12:50:40 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 loop 于 2011-5-3 17:13 编辑

我把我的实验五第五题的答案放上来,麻烦各位老师指出不当之处。
因为和题目一样设置C段我的编译器通不过,所以我改成了d,附上源代码 13.rar (303 Bytes, 下载次数: 10)
  1. assume cs:code,ds:a,es:b,ss:d
  2. a segment
  3.         db 1,2,3,4,5,6,7,8
  4. a ends

  5. b segment
  6.         db 1,2,3,4,5,6,7,8
  7. b ends

  8. d segment
  9.         db 1,2,3,4,5,6,7,8
  10. d ends

  11. code segment
  12. start:         mov ax,a
  13.                 mov ds,ax
  14.                 mov ax,b
  15.                 mov es,ax
  16.                 mov bx,0
  17.                 mov cx,8
  18. s1:             mov ax,es:[bx]
  19.                 add [bx],ax
  20.                 add bx,2
  21.                 loop s1
  22.                
  23.                 mov ax,d
  24.                 mov ss,ax
  25.                 mov sp,30h
  26.                 mov ax,a
  27.                 mov ds,ax
  28.                 mov bx,0
  29.                 mov cx,8
  30. s2:             push [bx]
  31.                 pop d:[bx]
  32.                 loop s2
  33.                
  34.                 mov ax,4c00h
  35.                 int 21h
  36. code ends
  37. end start

复制代码
以上我编译通过。但是我不知道正确与否!~


Debug第一步:(当时我请教网上的朋友,他没回复,我自己按照传统方法Debug查看)
加载程序后,我D查看了下,应该是OK
-d 13dc:0
13DC:0000  01 02 03 04 05 06 07 08-00 00 00 00 00 00 00 00   ................
13DC:0010  01 02 03 04 05 06 07 08-00 00 00 00 00 00 00 00   ................
13DC:0020  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
13DC:0030  B8 DC 13 8E D8 B8 DD 13-8E C0 BB 00 00 B9 08 00   ................
13DC:0040  26 8B 07 01 07 83 C3 02-E2 F6 B8 DE 13 8E D0 BC   &...............
13DC:0050  30 00 B8 DC 13 8E D8 BB-00 00 B9 08 00 FF 37 36   0.............76
13DC:0060  8F 07 E2 F9 B8 00 4C CD-21 CC 00 00 00 00 00 00   ......L.!.......
13DC:0070  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................


Debug第二步,程序运行完没有达到预期效果,13DC:0000和13DC:0020处应为一致才是。
程序运行完后D 13dc:0020处变为如下,我想可能哪里出错了~
-d 13dc:0
13DC:0000  02 04 06 08 0A 0C 0E 10-00 00 00 00 00 00 00 00   ................
13DC:0010  01 02 03 04 05 06 07 08-00 00 00 00 00 00 00 00   ................
13DC:0020  02 04 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
13DC:0030  B8 DC 13 8E D8 B8 DD 13-13 3E 4F 03 00 00 00 00   .........>O.....
13DC:0040  00 00 00 00 00 00 DC 13-DE 0D 39 00 CC 13 12 32   ..........9....2
13DC:0050  30 00 B8 DC 13 8E D8 BB-00 00 B9 08 00 FF 37 36   0.............76
13DC:0060  8F 07 E2 F9 B8 00 4C CD-21 CC 00 00 00 00 00 00   ......L.!.......
13DC:0070  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

进一步查看:
原来是我程序S2处少了一句 add bx,2
补充上这句
  1. s2: push [bx]
  2.                 pop d:[bx]
  3.                 add bx,2
  4.                 loop s2
复制代码
最终编译结果如下:
-d 13dc:0
13DC:0000  02 04 06 08 0A 0C 0E 10-00 00 00 00 00 00 00 00   ................
13DC:0010  01 02 03 04 05 06 07 08-00 00 00 00 00 00 00 00   ................
13DC:0020  02 04 06 08 0A 0C 0E 10-00 00 00 00 00 00 00 00   ................
13DC:0030  B8 DC 13 8E D8 B8 DD 13-13 3E 4F 03 00 00 00 00   .........>O.....
13DC:0040  00 00 00 00 00 00 DC 13-DE 0D 3C 00 CC 13 12 32   ..........<....2
13DC:0050  30 00 B8 DC 13 8E D8 BB-00 00 B9 08 00 FF 37 36   0.............76
13DC:0060  8F 07 83 C3 02 E2 F6 B8-00 4C CD 21 CC 00 00 00   .........L.!....
13DC:0070  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

应该是正确啦~~
程序看起来比较冗长,基本思路是将a段和b段先相加,相加结果放到a段,然后就是简单的将a段数据存到c段中,这个问题我们应该和测试点6.1(P129)第2题对某段内容进行改写问题是一样的,所以后半部分就是将a段内容改写至d段(写d段原因我在开头说了,另外我发现论坛内有部分TX反映c编译不了,可能也是这个原因,请改成d试试)内容。

最后还往各位指点,能给出比较简洁思路比较好的程序,我这个实在是为了完任务,当然可以使用后续章节的内容。谢谢!

评分

参与人数 2荣誉 +11 收起 理由
小甲鱼 + 6 支持原创,写的很不错。 精华!
loop + 5 非常不错!加精鼓励!~

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-4-12 18:37:37 | 显示全部楼层
请问那些 debug数据是你一个一个敲出来的吗? 厉害啊!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-4-13 09:34:19 | 显示全部楼层
回复 2# china0008


    可以复制的。先标记,后复制!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-4-13 09:36:59 | 显示全部楼层
回复 2# china0008


    对了 版主 你怎么没给我加威望,钱币啊什么的。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-4-13 10:22:07 | 显示全部楼层
希望甲鱼哥进来给看下!对我这个程序提点建议!Thanks!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-5-2 22:15:40 | 显示全部楼层
本帖最后由 loop 于 2011-5-3 17:05 编辑
  1. assume cs:code

  2. a segment
  3.         db 1, 2, 3, 4, 5, 6, 7, 8
  4. a ends

  5. b segment
  6.         db 1, 2, 3, 4, 5, 6, 7, 8
  7. b ends

  8. d segment
  9.         db 0, 0, 0, 0, 0, 0, 0, 0
  10. d ends

  11. code segment

  12. start:        mov ax, b
  13.         mov ds, ax
  14.         mov bx, 0
  15.         mov cx, 8
  16.         mov ax, d
  17.         mov es, ax
  18. s1:        mov al, [bx]
  19.         mov es:[bx], al
  20.         inc bx
  21.         loop s1
  22.         mov ax, a
  23.         mov ds, ax
  24.         mov bx, 0
  25.         mov cx, 8
  26. s2:        mov al, [bx]
  27.         add es:[bx], al
  28.         inc bx
  29.         loop s2
  30.        
  31.         mov ax, 4c00h
  32.         int 21h

  33. code ends

  34. end start
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-5-6 07:09:41 | 显示全部楼层
请问一下,为什么设置成C段就通不过?我也出现了这个问题,后来是下了一个老版本的masm才通过的,疑惑中:dizzy:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-5-9 08:40:18 | 显示全部楼层
我有疑问,我在论坛上也上传了我的代码,也提出了我的疑问,
对于您的代码我提出的疑问:
db指向系统申请字节类型单元是吧,8个字节单元应该是4个字单元才对,为什么要循环8次?不是4次就够了么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-5-9 11:34:05 | 显示全部楼层
编程,我感觉就是数据移过来,移过去,加上了,再减去,乘乘除除的数据是干什么的,会有什么结果呢,效果又会怎样?学到什么程度会感到有成就呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-5-9 13:12:40 | 显示全部楼层
我用一个循环加一个堆栈就搞定了!
  1. assume CS:fuck

  2. a SEGMENT
  3.     DB 1,2,3,4,5,6,7,8
  4. a ENDS

  5. b SEGMENT
  6.     DB 1,2,3,4,5,6,7,8
  7. b ENDS

  8. c SEGMENT
  9.     DB 0,0,0,0,0,0,0,0
  10. c ENDS

  11. fuck SEGMENT

  12. start:MOV AX,a
  13.       MOV DS,AX
  14.       MOV AX,b
  15.       MOV ES,AX
  16.       MOV AX,c
  17.       MOV SS,AX
  18.       MOV SP,8
  19.       MOV BX,7
  20.       MOV CX,8
  21.     s:MOV DL,DS:[BX]
  22.       ADD DL,ES:[BX]
  23.       MOV DH,DS:[BX-1]
  24.       ADD DH,ES:[BX-1]
  25.       SUB BX,2
  26.       PUSH DX
  27.       LOOP s
  28.       MOV AX,4c00h
  29.       INT 21h
  30. fuck ENDS
  31. END start
  32.       
复制代码

评分

参与人数 1荣誉 +1 收起 理由
loop + 1 我很赞同

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-5-11 23:40:17 | 显示全部楼层
本帖最后由 loop 于 2011-5-13 01:16 编辑

没用栈....仅一个循环....
  1. assume cs:code

  2. a segment
  3.         db 1,2,3,4,5,6,7,8
  4. a ends

  5. b segment
  6.         db 1,2,3,4,5,6,7,8
  7. b ends

  8. d segment
  9.         db 0,0,0,0,0,0,0,0
  10. d ends

  11. code segment
  12. start:
  13.                 mov cx,8        ;循环次数
  14.                 mov bx,0        ;偏移地址
  15.         s:
  16.                 mov ax,a
  17.                 mov ds,ax
  18.                 mov dx,ds:[bx]
  19.                
  20.                 mov ax,d
  21.                 mov ds,ax
  22.                 mov ds:[bx],dx
  23.                
  24.                 mov ax,b
  25.                 mov ds,ax
  26.                 mov dx,ds:[bx]

  27.                 mov ax,d
  28.                 mov ds,ax
  29.                 add ds:[bx],dx
  30.                
  31.                 inc bx
  32.                
  33.                 loop s
  34.                 mov ax,4c00h
  35.                 int 21h
  36. code ends
  37. end start
复制代码

评分

参与人数 1荣誉 +1 收起 理由
loop + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-5-12 13:05:26 | 显示全部楼层

A reserved word (such as C or SIZE) was used as an identifier.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-5-13 09:13:46 | 显示全部楼层
我也有这个问题,所以给分配的栈段改成了d,结果编译通过....
可能有内情:lol:lol
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-5-21 01:54:51 | 显示全部楼层
回复 shangyl00 的帖子

add bx,2

既然定义为字节类型,怎么每次bx加2呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-5-22 18:05:20 | 显示全部楼层
看不懂,可能我太菜。
你定义的是字节,为什么BX每次要+2
如果+2的话,你才定义4个字节。为什么又要循环8次。:funk:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-6-1 10:21:36 | 显示全部楼层
本帖最后由 shangyl00 于 2011-6-1 22:51 编辑
小唐 发表于 2011-5-22 18:05
看不懂,可能我太菜。
你定义的是字节,为什么BX每次要+2
如果+2的话,你才定义4个字节。为什么又要循环8 ...


Sorry,稍後回答你,還有8樓,14樓和15樓,好久沒看了,又忘記了。

看見沒,定義的三個段如圖:
段在我的電腦上地址在0BC7:0000開始
ScreenHunter_01 Jun. 01 13.04.gif

用T命令執行一次S1代碼,查看是運算了一個字節還是一個字(這裡只是為了驗證,實際上AX,BX這種寄存器肯定是字型運算的)
ScreenHunter_02 Jun. 01 13.11.gif

很明顯,儘管定義了8個字節,但是給段還是分配了16個字節。
因為寄存器是進行字型數據的傳送,也就是2個字節,所以BX每次加2.
先看看吧,讓我在回憶回憶。哎 不扎實啊。。
我準備結合幾個實例把這個問題澄清,大家敬請期待!如果哪位大俠想“插先”,歡迎!:lol

22:43分

晚上我刚回来,公司的电脑繁体太烦人。这里我将问题回答如下:
问题一:你定义的是字节,为什么BX每次要+2
我定义的是字节没错,但是运算时是按字运算的,想一想AX这种寄存器是不是字型大小?
问题二:如果+2的话,你才定义4个字节。为什么又要循环8 次
你可能忘记,段有个很重要的概念就是段地址必须为16的倍数,这就是说我代码里db后边跟的一串数据必须为16字节的倍数,那么定义了8个字节,所以这个段最小就应为16个字节。因为每次都进行了字运算,所以就循环了8次。
当然你也可以循环4次字型运算,或者8次字节运算,因为此题目只关心题目中定义的前8个字节的运算。

严谨的说,我的程式是多循环了4次,但我符合题目要求。你明白了吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-6-1 13:23:38 | 显示全部楼层
Seely 发表于 2011-5-12 13:05
A reserved word (such as C or SIZE) was used as an identifier.

這位兄弟可否分享下你看的資料!先謝謝了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-1 23:10:39 | 显示全部楼层
shangyl00 发表于 2011-6-1 13:23
這位兄弟可否分享下你看的資料!先謝謝了!

没资料,我当时也是出现这个问题,就胡乱搜索为什么,结果找到了这句……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-23 22:37:25 | 显示全部楼层
mov ax,d
mov ss,ax
mov sp,30h;设置30H应该是不对的,因为在PUSH之后,它改动了代码块的内容

但是,在调试的时候没出错。
这是因为执行进度已经超过了这块被改动了的代码块
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-25 22:57:25 | 显示全部楼层
10楼的weixianlang 写的程序是错误的 正确的写法应该是这样 debug才会给出正确的数值
assume cs:fuck

a segment
db 1,2,3,4,5,6,7,8
a ends

b segment
db 1,2,3,4,5,6,7,8
b ends

d segment
db 0,0,0,0,0,0,0,0
d ends

fuck segment
start:mov ax,a
      mov ds,ax
          mov ax,b
          mov es,ax
          mov ax,d
          mov ss,ax
          mov sp,8
          mov bx,7
          mov cx,8
        s:mov dh,ds:[bx]
          add dh,es:[bx]
          mov dl,ds:[bx-1]
          add dl,es:[bx-1]
          sub bx,2
          push dx
          loop s
          mov ax,4c00h
          int 21h
fuck ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-5-8 22:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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