鱼C论坛

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

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

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

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

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

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

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

code segment
start:         mov ax,a
                mov ds,ax
                mov ax,b
                mov es,ax
                mov bx,0
                mov cx,8
s1:             mov ax,es:[bx]
                add [bx],ax
                add bx,2
                loop s1
                
                mov ax,d
                mov ss,ax
                mov sp,30h
                mov ax,a
                mov ds,ax
                mov bx,0
                mov cx,8
s2:             push [bx]
                pop d:[bx]
                loop s2
                
                mov ax,4c00h
                int 21h
code ends
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
补充上这句
s2: push [bx]
                pop d:[bx]
                add bx,2
                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 编辑
assume cs:code

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

code segment

start:        mov ax, b
        mov ds, ax
        mov bx, 0
        mov cx, 8
        mov ax, d
        mov es, ax
s1:        mov al, [bx]
        mov es:[bx], al
        inc bx
        loop s1
        mov ax, a
        mov ds, ax
        mov bx, 0
        mov cx, 8
s2:        mov al, [bx]
        add es:[bx], al
        inc bx
        loop s2
        
        mov ax, 4c00h
        int 21h

code ends

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 | 显示全部楼层
我用一个循环加一个堆栈就搞定了!
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

c SEGMENT
    DB 0,0,0,0,0,0,0,0
c ENDS

fuck SEGMENT

start:MOV AX,a
      MOV DS,AX
      MOV AX,b
      MOV ES,AX
      MOV AX,c
      MOV SS,AX
      MOV SP,8
      MOV BX,7
      MOV CX,8
    s:MOV DL,DS:[BX]
      ADD DL,ES:[BX]
      MOV DH,DS:[BX-1]
      ADD DH,ES:[BX-1]
      SUB BX,2
      PUSH DX
      LOOP s
      MOV AX,4c00h
      INT 21h
fuck ENDS
END start
      

评分

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

查看全部评分

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

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

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

code segment
start:
                mov cx,8        ;循环次数
                mov bx,0        ;偏移地址
        s:
                mov ax,a
                mov ds,ax
                mov dx,ds:[bx]
                
                mov ax,d
                mov ds,ax
                mov ds:[bx],dx
                
                mov ax,b
                mov ds,ax
                mov dx,ds:[bx]

                mov ax,d
                mov ds,ax
                add ds:[bx],dx
                
                inc bx
                
                loop s
                mov ax,4c00h
                int 21h
code ends
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-11-22 16:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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