首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

回帖得分王爽老师书上的第六章 实验五 第5小题请大家帮小弟我点评下,看能不能在浓缩下代码

2012-03-14 
回帖得分王爽老师书上的第六章 实验五 第5小题请大家帮我点评下,看能不能在浓缩下代码题目 【回帖得分】程序

回帖得分王爽老师书上的第六章 实验五 第5小题请大家帮我点评下,看能不能在浓缩下代码
题目 【回帖得分】
程序如下,编写code段中的代码,将a段和b段中的数据依次相加,将结果存到c段中

Assembly code
assume cs:codea segment  db 1,2,3,4,5,6,7,8a endsb segment  db 1,2,3,4,5,6,7,8b endsc segment  db 0,0,0,0,0,0,0,0c endscode segmentstart:?code endsend start


====================写好的程序代码=======================

Assembly code
assume cs:codea segment  db 1,2,3,4,5,6,7,8a endsb segment  db 1,2,3,4,5,6,7,8b endsc segment  db 0,0,0,0,0,0,0,0c endscode segmentstart: mov ax,a       mov ds,ax       mov bx,0       mov cx,8    s: mov ax,ds:[bx]       mov dx,ds:[bx+16]       add dh,ah       add dl,al       mov ds:[bx+32],dx       add bx,2       loop s       mov ax,4c00h       int 21hcode endsend start


========================winXP3系统下DEBUG调试信息==================

-t

AX=0000 BX=0010 CX=0001 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0BC1 ES=0BB1 SS=0BC1 CS=0BC4 IP=001A NV UP EI PL NZ AC PO NC
0BC4:001A E2EF LOOP 000B
-t

AX=0000 BX=0010 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0BC1 ES=0BB1 SS=0BC1 CS=0BC4 IP=001C NV UP EI PL NZ AC PO NC
0BC4:001C B8004C MOV AX,4C00
-t

AX=4C00 BX=0010 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0BC1 ES=0BB1 SS=0BC1 CS=0BC4 IP=001F NV UP EI PL NZ AC PO NC
0BC4:001F CD21 INT 21
-d 0bc1:0
0BC1:0000 01 02 03 04 05 06 07 08-00 00 00 00 00 00 00 00 ................
0BC1:0010 01 02 03 04 05 06 07 08-00 00 00 00 00 00 00 00 ................
0BC1:0020 02 04 06 08 0A 0C 0E 10-00 00 00 00 00 00 00 00 ................
0BC1:0030 B8 C1 0B 8E D8 BB 00 00-B9 08 00 8B 07 8B 57 10 ..............W.
0BC1:0040 02 F4 02 D0 89 57 20 83-C3 02 E2 EF B8 00 4C CD .....W .......L.
0BC1:0050 21 2A E4 40 50 8B C3 05-0C 00 52 50 E8 91 43 83 !*.@P.....RP..C.
0BC1:0060 C4 04 50 8D 86 74 FF 50-E8 E7 6D 83 C4 06 C4 5E ..P..t.P..m....^
0BC1:0070 F8 26 8B 47 06 26 8B 57-08 89 46 FC 89 56 FE C4 .&.G.&.W..F..V..

[解决办法]
数据定义的8位的,怎么用16位寄存器来加?就算用16位加呗,怎么还能8次循环?再看看。。。
[解决办法]
你mov cx,8是要循环8次是吧,那么你mov ax,ds:[bx] mov dx,ds:[bx+16]是一次操作一个字(两个字节)是吧,那你循环8次你操作了16个字节是吧,那么数据段中定义的是db (8个字节),那么、、、你看看对么?
[解决办法]
Good~Job
[解决办法]
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 ;把c改成d即可正常编译,邪恶

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

code segment

start: mov ax,a
mov es,ax ;设置es指向a段
mov ax,d
mov ds,ax ;设置ds指向d段
mov bx,0

mov cx,8 ;设置循环次数
s: mov al,es:[bx] ;取es:[bx]即a段中的内存数据以字节为单位
add [bx],al ;将取出的内存数据与ds:[bx]即d段中数据相加,结果放到d段
inc bx ;bx自加1,对下一单元进行操作
loop s

mov ax,b
mov es,ax ;设置es指向b段
mov bx,0

mov cx,8 ;设置循环次数
s0: mov al,es:[bx] ;取es:[bx]即b段中的内存数据以字节为单位
add [bx],al ;将取出的内存数据与ds:[bx]即d段中数据相加,结果放到d段
inc bx ;bx自加1,对下一单元进行操作
loop s0



mov ax,4c00h
int 21h

code ends

end start


用c做段名无法编译通过。
[解决办法]

探讨
是啊,他定义了2个单元,一个单元16字节
我调试他是这样的,让我也解释不清楚

[解决办法]
学习
~~~~

热点排行