我正在尝试遍历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
答案 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结果为零则突破。
比较小写字符时,您需要使用jge
和jle
。
此指令mov bh,[bx]
会破坏指针BX。更好地使用AL而不是BH。
这条指令mov string3+2, bh
毫无意义!即使它确实编译,它也总是存储在同一个位置。