shangyl00 发表于 2011-4-12 12:50:40

实验5第5题Debug过程个人总结贴

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

我把我的实验五第五题的答案放上来,麻烦各位老师指出不当之处。
因为和题目一样设置C段我的编译器通不过,所以我改成了d,附上源代码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:
                add ,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
                pop d:
                loop s2
               
                mov ax,4c00h
                int 21h
code ends
end start

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


Debug第一步:(当时我请教网上的朋友,他没回复,我自己按照传统方法Debug查看)
加载程序后,我D查看了下,应该是OK
-d 13dc:0
13DC:000001 02 03 04 05 06 07 08-00 00 00 00 00 00 00 00   ................
13DC:001001 02 03 04 05 06 07 08-00 00 00 00 00 00 00 00   ................
13DC:002000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
13DC:0030B8 DC 13 8E D8 B8 DD 13-8E C0 BB 00 00 B9 08 00   ................
13DC:004026 8B 07 01 07 83 C3 02-E2 F6 B8 DE 13 8E D0 BC   &...............
13DC:005030 00 B8 DC 13 8E D8 BB-00 00 B9 08 00 FF 37 36   0.............76
13DC:00608F 07 E2 F9 B8 00 4C CD-21 CC 00 00 00 00 00 00   ......L.!.......
13DC:007000 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:000002 04 06 08 0A 0C 0E 10-00 00 00 00 00 00 00 00   ................
13DC:001001 02 03 04 05 06 07 08-00 00 00 00 00 00 00 00   ................
13DC:002002 04 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
13DC:0030B8 DC 13 8E D8 B8 DD 13-13 3E 4F 03 00 00 00 00   .........>O.....
13DC:004000 00 00 00 00 00 DC 13-DE 0D 39 00 CC 13 12 32   ..........9....2
13DC:005030 00 B8 DC 13 8E D8 BB-00 00 B9 08 00 FF 37 36   0.............76
13DC:00608F 07 E2 F9 B8 00 4C CD-21 CC 00 00 00 00 00 00   ......L.!.......
13DC:007000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

进一步查看:
原来是我程序S2处少了一句 add bx,2
补充上这句s2: push
                pop d:
                add bx,2
                loop s2
最终编译结果如下:
-d 13dc:0
13DC:000002 04 06 08 0A 0C 0E 10-00 00 00 00 00 00 00 00   ................
13DC:001001 02 03 04 05 06 07 08-00 00 00 00 00 00 00 00   ................
13DC:002002 04 06 08 0A 0C 0E 10-00 00 00 00 00 00 00 00   ................
13DC:0030B8 DC 13 8E D8 B8 DD 13-13 3E 4F 03 00 00 00 00   .........>O.....
13DC:004000 00 00 00 00 00 DC 13-DE 0D 3C 00 CC 13 12 32   ..........<....2
13DC:005030 00 B8 DC 13 8E D8 BB-00 00 B9 08 00 FF 37 36   0.............76
13DC:00608F 07 83 C3 02 E2 F6 B8-00 4C CD 21 CC 00 00 00   .........L.!....
13DC:007000 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试试)内容。

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

china0008 发表于 2011-4-12 18:37:37

请问那些 debug数据是你一个一个敲出来的吗? 厉害啊!

shangyl00 发表于 2011-4-13 09:34:19

回复 2# china0008


    可以复制的。先标记,后复制!

shangyl00 发表于 2011-4-13 09:36:59

{:5_92:} 回复 2# china0008


    对了 版主 你怎么没给我加威望,钱币啊什么的。。。。

shangyl00 发表于 2011-4-13 10:22:07

希望甲鱼哥进来给看下!对我这个程序提点建议!Thanks!

iclassic 发表于 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,
        mov es:, al
        inc bx
        loop s1
        mov ax, a
        mov ds, ax
        mov bx, 0
        mov cx, 8
s2:        mov al,
        add es:, al
        inc bx
        loop s2
       
        mov ax, 4c00h
        int 21h

code ends

end start

狸猫副园长 发表于 2011-5-6 07:09:41

请问一下,为什么设置成C段就通不过?我也出现了这个问题,后来是下了一个老版本的masm才通过的,疑惑中:dizzy:

sundelian 发表于 2011-5-9 08:40:18

我有疑问,我在论坛上也上传了我的代码,也提出了我的疑问,
对于您的代码我提出的疑问:
db指向系统申请字节类型单元是吧,8个字节单元应该是4个字单元才对,为什么要循环8次?不是4次就够了么?

moshushi 发表于 2011-5-9 11:34:05

编程,我感觉就是数据移过来,移过去,加上了,再减去,乘乘除除的数据是干什么的,会有什么结果呢,效果又会怎样?学到什么程度会感到有成就呢?

weixianlang 发表于 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:
      ADD DL,ES:
      MOV DH,DS:
      ADD DH,ES:
      SUB BX,2
      PUSH DX
      LOOP s
      MOV AX,4c00h
      INT 21h
fuck ENDS
END start
      

sundelian 发表于 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:
               
                mov ax,d
                mov ds,ax
                mov ds:,dx
               
                mov ax,b
                mov ds,ax
                mov dx,ds:

                mov ax,d
                mov ds,ax
                add ds:,dx
               
                inc bx
               
                loop s
                mov ax,4c00h
                int 21h
code ends
end start

Seely 发表于 2011-5-12 13:05:26

狸猫副园长 发表于 2011-5-6 07:09 static/image/common/back.gif
请问一下,为什么设置成C段就通不过?我也出现了这个问题,后来是下了一个老版本的masm才通过的,疑惑中:di ...

A reserved word (such as C or SIZE) was used as an identifier.

sundelian 发表于 2011-5-13 09:13:46

我也有这个问题,所以给分配的栈段改成了d,结果编译通过....
可能有内情:lol:lol

wen_hu 发表于 2011-5-21 01:54:51

回复 shangyl00 的帖子

add bx,2

既然定义为字节类型,怎么每次bx加2呢?

小唐 发表于 2011-5-22 18:05:20

看不懂,可能我太菜。
你定义的是字节,为什么BX每次要+2
如果+2的话,你才定义4个字节。为什么又要循环8次。:funk:

shangyl00 发表于 2011-6-1 10:21:36

本帖最后由 shangyl00 于 2011-6-1 22:51 编辑

小唐 发表于 2011-5-22 18:05 static/image/common/back.gif
看不懂,可能我太菜。
你定义的是字节,为什么BX每次要+2
如果+2的话,你才定义4个字节。为什么又要循环8 ...

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

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


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


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

22:43分

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

严谨的说,我的程式是多循环了4次,但我符合题目要求。你明白了吗?

shangyl00 发表于 2011-6-1 13:23:38

Seely 发表于 2011-5-12 13:05 static/image/common/back.gif
A reserved word (such as C or SIZE) was used as an identifier.

這位兄弟可否分享下你看的資料!先謝謝了!

Seely 发表于 2011-6-1 23:10:39

shangyl00 发表于 2011-6-1 13:23 static/image/common/back.gif
這位兄弟可否分享下你看的資料!先謝謝了!

没资料,我当时也是出现这个问题,就胡乱搜索为什么,结果找到了这句……

linha0 发表于 2011-6-23 22:37:25

mov ax,d
mov ss,ax
mov sp,30h;设置30H应该是不对的,因为在PUSH之后,它改动了代码块的内容

但是,在调试的时候没出错。
这是因为执行进度已经超过了这块被改动了的代码块

夜读金瓶梅 发表于 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:
          add dh,es:
          mov dl,ds:
          add dl,es:
          sub bx,2
          push dx
          loop s
          mov ax,4c00h
          int 21h
fuck ends
end start
页: [1] 2
查看完整版本: 实验5第5题Debug过程个人总结贴