需要帮助使用 masm 以 80x86 汇编语言连接两个字符串

Posted

技术标签:

【中文标题】需要帮助使用 masm 以 80x86 汇编语言连接两个字符串【英文标题】:Need help concatenating two strings in 80x86 assembly language using masm 【发布时间】:2020-11-23 04:37:01 【问题描述】:

您好,我用 80x86 汇编语言编写了一个程序,它使用连接两个字符串的 masm。我正在尝试做的是找到第一个字符串的末尾在哪里,然后将第二个字符串的内容添加到第一个字符串上。这是我到目前为止的代码:


.586
.MODEL FLAT
.STACK 4096
INCLUDE io.h 

.DATA
prompt      BYTE    "Input String", 0
string1     BYTE    80 DUP (?)
string2     BYTE    80 DUP (?)
displayLbl  BYTE    "Concatenated string", 0

.CODE
_MainProc PROC
        input   prompt, string1, 80 ; ask for first string
        input   prompt, string2, 80 ; repeat for second string

        lea     eax, string1        
        push    eax                 
        lea     ebx, string2
        push    ebx

        call    strConcatenation    ; procedure to concatenate the strings

        add     esp, 8              ; remove parameters
        output  displayLbl, string1 ; display result

        mov     eax, 0              ; exit with return code 0
        ret
_MainProc ENDP

strConcatenation PROC

        push    ebp
        mov     ebp, esp
        push    edi
        push    esi
        pushfd

        mov     edi, [ebp+8]
        repnz   scasb               ; scan for null in string1
        
        mov     esi, [ebp+12]
        dec     edi

        cld
whileConcStr:
        cmp     BYTE PTR [esi], 0   ; null source byte?
        je      endWhile            ; stop copying if null

        lodsb                       ; load data
        stosb                       ; store data
        jmp     whileConcStr        ; go check next byte
endWhile:
        mov     BYTE PTR [edi], 0   ; terminate destination string

        popfd                       ; restore flags
        pop     esi                 ; restore registers
        pop     edi
        pop     ebp
        ret     
        
strConcatenation ENDP

END

当我输入诸如“程序集”和“语言”之类的字符串时,没有任何变化。任何帮助表示赞赏,谢谢。

【问题讨论】:

一条评论是repnz 将在每次迭代中递减ecx 并在它变为零时终止,这是您不想要的。因此,您可以在开始之前将ecx 设置为-1,实际上要求最多重复2^32 次。 所以我尝试将 ecx 设置为 -1,我会得到一个错误或相同的结果 我认为您对 strConcatenation 的论点颠倒了。就目前而言,它将string1 连接到string2 的末尾,听起来你想要它反过来。 尝试扭转它们仍然不起作用很可能问题出在我的程序中 哦,您必须在 repne scasb 之前清零 al。否则,您正在搜索一些随机值而不是零。通过这些修复,该功能对我有用。 【参考方案1】:

三个错误:

你对strConcatenation 的论点被颠倒了。就目前而言,您将string1 连接到string2 的末尾。

repne scasb 扫描al 寄存器中的值,该值尚未初始化。要扫描 nul,请将其归零:xor al, al

repne scasb 在找到al 中的字节或ecx 达到零时终止(每次迭代递减)。你也没有初始化ecx。要无限期扫描直到找到字节,您可以将ecx 设置为-1

【讨论】:

顺便说一句,xor eax,eax 是一种更有效的归零 AL 的方法,将整个寄存器归零,而不是将零合并到旧内容的低字节中。在现代 CPU 上,xor al,al 并非特例为 dependency-breaking zeroing idiom。当然,它仍然是正确的,只是更慢。

以上是关于需要帮助使用 masm 以 80x86 汇编语言连接两个字符串的主要内容,如果未能解决你的问题,请参考以下文章

MASM32使用教程

需要循环帮助以迭代地添加到汇编中的总和变量

ASM:MASM、NASM、FASM?

masm - 字母大小写转换

《80X86汇编语言程序设计教程》十二 任务状态段控制门和控制转移

汇编 MASM 字符串比较