将某些字符从一个字符串复制到另一个字符串中

时间:2014-11-24 10:31:03

标签: assembly x86-16

我正在尝试遍历string1并将字母字符复制到string3中。到目前为止我的代码在下面,可能不是最好的,但它可以工作到一个点并将字母放入string3的第一个点。然而,下一次它只是覆盖那个字符,直到我最后留下一个空字符串。有谁知道如何解决它,以便它将string1的元素保存到string3的下一个空闲空间?非常感谢这让我发疯了!!!

MOV DX,OFFSET STRING1+2 ; dx = address of string1
mov bx, dx       ; bx = dx = address of string1
mov ch, 0      ; set cx to string size for loop 
mov cl, [bx+1] 
; print prompt
call PTHIS       
db  13, 10, "removed non-alphanumeric characters1: ",0

remove_char:
; check if it's not a lower case letter:
cmp byte ptr [bx], 'a'
jg ok3          ; if char is 'a' or above, goto 'ok3'
cmp byte ptr [bx], 'z'
jl ok3                  ; if char is below 'z', goto 'ok3'
cmp [bx],'$'
je '$', next
; ... goto 'ok3' anyway... ("fall through")
inc bx ; next char.

ok3:
push [bx]
lea dx, string3+2 
pop [bx]
mov bh, [bx]
mov string3+2, bh
inc bx ; next char.
loop remove_char

2 个答案:

答案 0 :(得分:1)

mov cl, [bx+1]检查后,cx是否为零。如果cx为零,则必须在此时断开循环,否则循环将重复65536次。在mov cl, [bx+1]

之后的行中插入此代码
cmp cx, 0
je exit

并在末尾插入标签exit(或任何您想要插入的内容)。这可以确保,如果cx为零,则不会执行代码。

答案 1 :(得分:0)

为什么要从第二个字节中提取字符串的长度?对我来说

MOV DX,OFFSET STRING1+2 ; dx = address of string1  

稍微暗示长度将存储在带前缀的单词中。如果是这样的话,请使用mov cx,[bx-2],如果CX结果为零则突破。

比较小写字符时,您需要使用jgejle

此指令mov bh,[bx]会破坏指针BX。更好地使用AL而不是BH。

这条指令mov string3+2, bh毫无意义!即使它确实编译,它也总是存储在同一个位置。