assembly 在程序集(.exe)中将2个字符串组合成一个更长的字符串-这段代码是如何工作的?

mitkmikd  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(76)

我在汇编程序中收到了一个代码,它将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
k4emjkb1

k4emjkb11#

21                 mov     cx, LENGTH_STRING1         
  22                 mov     si, OFFSET String1     
  23                 mov     di, OFFSET String3
  • 第21行得到String1cx的长度。
  • 第22行将指向String1(第一个字符串)的指针放入si
  • 第23行将指向String3(空闲空间)的指针放入di
24               LOOP1:
  25                 mov     dl, [si]
  26                 mov     [di], dl
  27                 inc     si
  28                 inc     di
  29                 loop    LOOP1

String1的内容覆盖String3,这种方法虽然有效,但效率很低。因为我们将指向String1的指针加载到si中,所以第25行将从String1读取一个字节到dl中。然后第26行将该字节写入String3。然后,我们将sidi加1,以便下一次读写操作都针对每个字节的下一个字母。此过程重复进行,直到cx = 0,由第29行完成。
这一切都可以用rep movsb来完成。

31                 mov     cx, LENGTH_STRING2         
  32                 mov     si, OFFSET String2

现在,我们需要将字符串2复制到剩余的可用空间中,由于我们之前的工作,di已经在正确的位置,所以我们不重新加载它,而是将String2的长度复制到cx中,将String2的指针复制到si中,并在下一个循环中重复这个过程。

40                 mov     ah, 09h                    
  41                 mov     dx, OFFSET String3     
  42                 int     21h

最后,这将字符串打印到屏幕上。

相关问题