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

问题描述:

我试图通过字符串1循环并将字母字符复制到字符串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 
+0

我从来没有见过这种语法或指令。你能帮我理解吗? 'je'$',接下来'我找不到记录(但我只花了5分钟的时间寻找它)。 – 2014-11-25 00:44:48

+0

我无法理解你为什么在这三条线上推送和弹出... \t 'push [bx] //为什么推? //// lea dx,string3 + 2 //好的,指向某处的dx //// pop [bx] //不必要的指令,bx没有改变'你'推'bx,那么你对bx不做任何事情,那么你'流行bx'。不知道为什么你这样做(ps,注释每一行以及你做其他的,你会在它们发生之前看到更多的错误)。 – 2014-11-25 00:48:30

+0

用你的调试器来逐步了解这一点,让我们知道'RET'语句在'PTHIS'子程序中。 – 2014-11-25 01:00:37

经过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结果为零,则发生突变。

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

该指令mov bh,[bx]销毁您的指针BX。更好地使用AL来代替BH。

该指令mov string3+2, bh没有任何意义!即使编译它也会始终存储在相同的位置。