汇编语言8086的一个问题,程序如下,为什么我执行程序后str1是从ds 0200h开始存储的?

数据段从100H开始存放字符串str1,从200H开始存放str2,二者均以NULL字符为结束符,
;编写程序将str2拷贝到str1末尾,形成一个完整字符串
data segment para ; 定义数据段
org 0100h
str1 db 0dh,0ah,'The first string.',0
org 0200h
str2 db 0dh,0ah,'The second string.',0
data ends
ss_seg segment stack
db 100 dup(0)
ss_seg ends
code segment para
assume cs:code, ds:data, ss:ss_seg
main proc far
mov ax, data
mov ds, ax
mov es,ax
;计算str1长度
mov di,offset str1
mov dl,0
circle1:
inc di
cmp dl,[ds:di]
jnz circle1

mov si,offset str2
mov dl,0
circle2:
cmp dl,[ds:si]
jz point
mov dl,[ds:si]
mov [ds:di],dl
inc si
inc di
jmp circle2
point:
mov [ds:di],0

mov ax,4c00h
int 21h
main endp

code ends
end main

第1个回答  2014-11-09
//注意下面的代码:
/*inc di后dl的值也+1了,dl是di的低8位,这个循环在你的程序中,一直到循环256次后 di=100000000b ,dl才会溢出再为0,此时di指向的位置是str1的偏移0x100+256(0x100)也就是0x200*/
circle1:
inc di
cmp dl,[ds:di] //此处你本意应是与0比较,现在比较的已经不是0了
jnz circle1

//具体我没有测试,你试着把这里的dl用寄存器al,bl之类代替,还有问题的话,你留言本回答被网友采纳
第2个回答  2014-11-09
最好用串操作指令来完成。

;数据段从100H开始存放字符串str1,从200H开始存放str2,
;二者均以NULL字符为结束符,

;编写程序将str2拷贝到str1末尾

ASSUME CS:CODE, DS:DATA

DATA SEGMENT PARA
ORG 0100H
STR1 DB 0DH, 0AH, 'THE FIRST STRING.', 0
STR1_LEN EQU $ - STR1

ORG 0200H
STR2 DB 0DH, 0AH, 'THE SECOND STRING.', 0
STR2_LEN EQU $ - STR2

DATA ENDS

CODE SEGMENT

MAIN:
MOV AX, DATA
MOV DS, AX
MOV ES, AX

MOV SI, OFFSET STR2
MOV DI, OFFSET STR1
ADD DI, STR1_LEN

MOV CX, STR2_LEN
CLD
REP MOVSB ;一条指令,即可

MOV AX, 4C00H
INT 21H

CODE ENDS
END MAIN本回答被提问者采纳
相似回答