实验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试试)内容。
最后还往各位指点,能给出比较简洁思路比较好的程序,我这个实在是为了完任务,当然可以使用后续章节的内容。谢谢! 请问那些 debug数据是你一个一个敲出来的吗? 厉害啊! 回复 2# china0008
可以复制的。先标记,后复制! {:5_92:} 回复 2# china0008
对了 版主 你怎么没给我加威望,钱币啊什么的。。。。 希望甲鱼哥进来给看下!对我这个程序提点建议!Thanks! 本帖最后由 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 请问一下,为什么设置成C段就通不过?我也出现了这个问题,后来是下了一个老版本的masm才通过的,疑惑中:dizzy: 我有疑问,我在论坛上也上传了我的代码,也提出了我的疑问,
对于您的代码我提出的疑问:
db指向系统申请字节类型单元是吧,8个字节单元应该是4个字单元才对,为什么要循环8次?不是4次就够了么? 编程,我感觉就是数据移过来,移过去,加上了,再减去,乘乘除除的数据是干什么的,会有什么结果呢,效果又会怎样?学到什么程度会感到有成就呢? 我用一个循环加一个堆栈就搞定了!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
本帖最后由 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 狸猫副园长 发表于 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. 我也有这个问题,所以给分配的栈段改成了d,结果编译通过....
可能有内情:lol:lol 回复 shangyl00 的帖子
add bx,2
既然定义为字节类型,怎么每次bx加2呢? 看不懂,可能我太菜。
你定义的是字节,为什么BX每次要+2
如果+2的话,你才定义4个字节。为什么又要循环8次。:funk: 本帖最后由 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次,但我符合题目要求。你明白了吗?
Seely 发表于 2011-5-12 13:05 static/image/common/back.gif
A reserved word (such as C or SIZE) was used as an identifier.
這位兄弟可否分享下你看的資料!先謝謝了! shangyl00 发表于 2011-6-1 13:23 static/image/common/back.gif
這位兄弟可否分享下你看的資料!先謝謝了!
没资料,我当时也是出现这个问题,就胡乱搜索为什么,结果找到了这句…… mov ax,d
mov ss,ax
mov sp,30h;设置30H应该是不对的,因为在PUSH之后,它改动了代码块的内容
但是,在调试的时候没出错。
这是因为执行进度已经超过了这块被改动了的代码块 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