回帖得分王爽老师书上的第六章 实验五 第5小题请大家帮我点评下,看能不能在浓缩下代码题目 【回帖得分】程序
回帖得分王爽老师书上的第六章 实验五 第5小题请大家帮我点评下,看能不能在浓缩下代码
题目 【回帖得分】
程序如下,编写code段中的代码,将a段和b段中的数据依次相加,将结果存到c段中
Assembly codeassume 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 codeassume 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做段名无法编译通过。
[解决办法]
[解决办法]学习
~~~~