Assembly 将某些字符从程序集中的一个字符串复制到另一个字符串

Assembly 将某些字符从程序集中的一个字符串复制到另一个字符串,assembly,x86-16,Assembly,X86 16,我正在尝试通过字符串1循环,并将alpha字符复制到字符串3中。到目前为止,我的代码如下,可能不是最好的,但它在一定程度上起作用,并将字母放入string3的第一点。然而,下一次它只是覆盖了那个字符,直到我在结尾留下一个空字符串。有人知道如何修复它,以便将string1的元素保存到string3的下一个可用空间中吗?非常感谢这让我发疯 MOV DX,OFFSET STRING1+2 ; dx = address of string1 mov bx, dx ; bx = dx = ad

我正在尝试通过字符串1循环,并将alpha字符复制到字符串3中。到目前为止,我的代码如下,可能不是最好的,但它在一定程度上起作用,并将字母放入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

mov cl之后,[bx+1]
检查
cx
是否为零。如果
cx
为零,则必须在此时中断循环,否则循环将重复65536次。在
mov cl[bx+1]
后面的行中插入此代码:

cmp cx, 0
je exit

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

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

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
毫无意义!即使它确实编译,它也将始终存储在同一位置。

我以前从未见过这种语法或指令。你能帮我理解吗
je'$',next
我找不到它的文档(但我只花了5分钟寻找)。我不明白你为什么在这三行中推和弹出…
push[bx]//为什么推?///lea dx,string3+2//好的,点dx某处///pop[bx]//不需要的指令,bx没有改变
你推bx,然后你对bx不做任何事情,然后你推pop bx。不知道您为什么要这样做(请注意,注释每一行以及其他行,在它们发生之前,您会看到更多的错误。)使用调试器逐步完成此操作,并让我们知道
PTHIS
子例程中的
RET
语句之后会发生什么。