assembly 汇编8086 -如何将字符串缓冲区插入另一个字符串缓冲区?

wlp8pajw  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(156)

我正在编写一个程序,它不是“1bc”,而是“ONEbc”。然而,我很难将一个字符串插入另一个字符串中。我设法做到了,程序改变了每个字符,但我需要插入整个字符串,而不是逐个符号地插入,同时我的程序也不打印其余的文本(只是“ONE”)。这是将1变为ONE的段。

.DATA
        one db "ONE" ; I want to include this into my code somehow

**************************************************

    MOV cx, ax
    MOV si, offset firstBuf ; (firstBuf db "1bc")
    MOV di, offset newBuf ; (should be "ONEbc" after this)
  work:
    MOV dl, [si]
    CMP dl, '1'
    JNE continue  
        ADD ax, 3     
    MOV cx, ax
    MOV [di], 'O'
    INC si
    INC di
    MOV [di], 'N'
    INC si
    INC di
    MOV [di], 'E'   
    JMP next
  continue: 
    MOV [di], dl   
  next:
    INC si
    INC di
    LOOP    work

正如你所看到的,我试过一个符号接一个符号地输入字符串,但是我认为有一个更好的方法来做到这一点。我是一个初学者,我使用emu8086,如果这有帮助的话。

f5emj3cl

f5emj3cl1#

输出没有显示“bc”,因为SI寄存器上有2个额外的增量!并且在循环中间更改CX会导致阅读超过源字符串,因此也不要这样做。

MOV cx, ax       ; Length of the input string
  work:
    MOV dl, [si]
    INC si
    CMP dl, '1'
    JNE continue  
    ADD ax, 2        ; New length of the output string we're building
    MOV [di], 'O'
    INC di
    MOV [di], 'N'
    INC di
    MOV dl, 'E'   
  continue: 
    MOV [di], dl
    INC di
    LOOP    work

我试过一个符号接一个符号地写字符串,但我认为有更好的方法。
您可以同时输出2个字符:

MOV cx, ax       ; Length of the input string
  work:
    MOV dl, [si]
    INC si
    CMP dl, '1'
    JNE continue  
    ADD ax, 2        ; New length of the output string we're building
    MOV word [di], 'ON'
    ADD di, 2
    MOV dl, 'E'   
  continue: 
    MOV [di], dl
    INC di
    LOOP    work

你也可以从其他地方检索“ONE”字符串。如果要插入的文本有点长,这尤其有趣。

MOV cx, ax       ; Length of the input string
  work:
    MOV dl, [si]
    INC si
    CMP dl, '1'
    JNE continue  
    mov bx, OFFSET one
    mov bp, 2
    add ax, bp        ; New length of the output string we're building
nestedLoop:
    mov dl, [bx]
    inc bx
    mov [di], dl
    inc di
    dec bp
    jnz nestedLoop
    mov dl, [bx]
  continue: 
    MOV [di], dl
    INC di
    LOOP    work

相关问题