我在汇编程序中收到了一个代码,它将2个字符串相加在一起。不幸的是,我不明白这个程序从第21行到第42行是如何工作的。有人能描述一下这个程序在这方面是如何逐行工作的吗?谢谢!
.MODEL SMALL
Data SEGMENT
String1 DB "It is our first string ",13,10,'$'
LENGTH_STRING1 EQU 23
String2 DB "It is second string",13,10,'$'
LENGTH_STRING2 EQU 25
String3 DB LENGTH_STRING1 + LENGTH_STRING2 DUP (?), 13, 10, '$'
Data ENDS
Code SEGMENT
ASSUME CS:Code, DS:Data, SS:Bundle
Start:
mov ax, SEG Data
mov ds, ax
21 mov cx, LENGTH_STRING1
22 mov si, OFFSET String1
23 mov di, OFFSET String3
24 LOOP1:
25 mov dl, [si]
26 mov [di], dl
27 inc si
28 inc di
29 loop LOOP1
30
31 mov cx, LENGTH_STRING2
32 mov si, OFFSET String2
33 LOOP2:
34 mov dl, [si]
35 mov [di], dl
36 inc si
37 inc di
38 loop LOOP2
39
40 mov ah, 09h
41 mov dx, OFFSET String3
42 int 21h
mov ax, 4C00h
int 21h
Code ENDS
Bundle SEGMENT STACK
DB 100h DUP (?)
Bundle ENDS
END Start
1条答案
按热度按时间k4emjkb11#
String1
到cx
的长度。String1
(第一个字符串)的指针放入si
。String3
(空闲空间)的指针放入di
。用
String1
的内容覆盖String3
,这种方法虽然有效,但效率很低。因为我们将指向String1
的指针加载到si
中,所以第25行将从String1
读取一个字节到dl
中。然后第26行将该字节写入String3
。然后,我们将si
和di
加1,以便下一次读写操作都针对每个字节的下一个字母。此过程重复进行,直到cx = 0
,由第29行完成。这一切都可以用
rep movsb
来完成。现在,我们需要将字符串2复制到剩余的可用空间中,由于我们之前的工作,
di
已经在正确的位置,所以我们不重新加载它,而是将String2
的长度复制到cx
中,将String2
的指针复制到si
中,并在下一个循环中重复这个过程。最后,这将字符串打印到屏幕上。