当前位置: 代码迷 >> 汇编语言 >> 回帖得分王爽老师书上的第六章 实验五 第5小题请大家帮小弟我点评下,看能不能在浓缩下代码
  详细解决方案

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

热度:321   发布时间:2013-02-26 00:00:00.0
回帖得分王爽老师书上的第六章 实验五 第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
  相关解决方案