2014-11-24 246 views
0

我試圖通過字符串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

回答

1

經過mov cl, [bx+1]檢查,cx是否爲零。如果cx爲零,則此時必須打破循環,否則循環將被重複65536次。插入行的代碼mov cl, [bx+1]後:

cmp cx, 0 
je exit 

,並插入一個標籤exit(或者任何你想插入)結尾。這可以確保,如果cx爲零,代碼不會被執行。

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沒有任何意義!即使編譯它也會始終存儲在相同的位置。

相關問題