【问题标题】:assembly concatenate two strings程序集连接两个字符串
【发布时间】:2016-08-08 11:36:11
【问题描述】:

我想连接两个字符串,但在我的输出中,我得到了一行奇怪的字符和空格,而不是得到最终的连接字符串,也许有人可以帮助我。我想将结果保存在 s3 中。这是代码

DATA SEGMENT
    STR1 DB "ENTER FIRST STRING HERE ->$"
    STR2 DB "ENTER SECOND STRING HERE ->$"
    STR3 DB "CONCATEnatedD STRING :->$"
    STR11 DB "FIRST STRING : ->$"
    STR22 DB "SECOND STRING: ->$"

    s1 DB 20 DUP("$")
    s2 DB 20 DUP("$")
    s3 db 40 dup(?)
    NEWLINE DB 10,13,"$"

DATA ENDS

CODE SEGMENT

    ASSUME DS:DATA,CS:CODE
START:

    MOV AX,DATA
    MOV DS,AX


lea dx,str1
mov ah,09h
int 21h

lea si,s1

l1: mov ah,01h
int 21h

mov [si],al
inc si
cmp al,31h
jne l1

dec si

lea dx,str2
mov ah,09h
int 21h

lea di,s2

l2: mov ah,01h
int 21h

mov [di],al
inc di
cmp al,32h
jnz l2

lea si,s3
lea di,s1


lea si,s3
lea di,s1
l3: mov al,[di]
mov [si],al
inc si
inc di
cmp al,31h
jnz l3

dec si

lea di,s2

l4: mov al,[di]
mov [si],al
inc si
inc di
cmp al,32h
jnz l4

lea dx,str3
mov ah,09h
int 21h

l5: mov dl,[si]
cmp dl,32h
jz l6
mov ah,02h
int 21h
inc si
jmp l5


l6:MOV AH,4CH
    INT 21H


CODE ENDS
END START

我找到了解决方案,希望它是一个好的解决方案,没有任何错误: 数据段 味精 db 0Dh, 0Ah, "String1: $" msg2 db 0Dh, 0Ah, "String2: $" rev db 0Dh, 0Ah, "结果:$"

buffer label byte  
buffer2 label byte
str_maxlen db 255
str_length db 0

str_string db 255 dup(0)
str_string2 db 255 dup(0)
result db 255 dup('$')
num db 0
data ends

code segment
assume cs:code, ds:data
start:
mov ax,data
mov ds,ax

lea dx,msg
mov ah,09h
int 21h

lea dx,buffer
mov ah,0Ah
int 21h

mov cl,str_length
mov bh,cl
mov ch,0
lea si,str_string
lea di,result

op1:    mov bl,[si]
mov [di],bl
inc di
inc si
loop op1

mov cl,bh
op3:    dec si
loop op3

lea dx,msg2
mov ah,09h
int 21h

lea dx,buffer2
mov ah,0Ah
int 21h
mov cl,str_length

lea si,str_string
mov cl,str_length

mov ax,0
op2:    mov al,[si]
mov [di],al
inc di
inc si
loop op2

lea dx,rev
mov ah,09h
int 21h

lea dx,result
mov ah,09h
int 21h

mov ah,4Ch
int 21h
code ends

end start

【问题讨论】:

  • 你为什么一直比较被复制的字符和31h作为复制循环的终止条件? 31h 表示数字 1 的 ASCII。
  • 我投票结束,因为我相信这是一项家庭作业,我看不出 OP 如何努力解决他们的问题。也许他们受到了first successful attempt for a cheap solution 的鼓励?
  • 这不是功课,只是一种爱好,当我没有找到解决方案时,我作为最后的手段在这里问。还有谁在夏天有这样的功课?那些学习装配的人在正常的学校时间而不是八月在大学学习。
  • @user3848412 很高兴知道您喜欢编程。 :) 但是,为什么你不想学习如何使用调试器呢?这与汇编程序一样重要。
  • 我使用调试器,但我并不总是发现我的错误。

标签: assembly dos tasm x86-16


【解决方案1】:

在您的第一个代码中,您必须将si 设置为在标签l5: 之前指向字符串s3 的开头(因为si 指向@ 的结尾987654325@ 循环后l4:) :

.
.
.
lea dx,str3
mov ah,09h
int 21h

lea si,s3          ;◄■■■■■■■■■■■  
l5: mov dl,[si]
cmp dl,32h
jz l6
.
.
.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 2013-11-05
    • 2011-08-29
    • 2020-08-19
    • 2019-03-29
    相关资源
    最近更新 更多