2014-11-24 4 views
0

Я пытаюсь пропустить строку1 и скопировать альфа-символы в строку3. Код, который я до сих пор ниже, возможно, не самый лучший, но он работает до точки и помещает письмо в первую точку строки3. Однако в следующий раз он просто перезаписывает этот символ, пока я не останусь с пустой строкой в ​​конце. Кто-нибудь знает, как исправить это, чтобы сохранить элемент 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 '$', next' Я не мог найти его документированным (но я потратил всего 5 минут на его поиск). –

+0

Я не могу понять, почему вы нажимаете и вставляете эти три строки ... \t 'push [bx] // почему push? //// lea dx, string3 + 2 // Okay, point dx где-то //// pop [bx] // ненужная инструкция, bx не изменилась 'вы' push' bx, тогда вы ничего не делаете для bx , то вы 'pop bx'. Нет подсказки, почему вы это делаете (ps, прокомментируйте каждую строку, а вы делаете остальные, и вы увидите больше ошибок до того, как они произойдут.) –

+0

Проделайте это с помощью отладчика и сообщите нам, что происходит после 'RET' в подпрограмме 'PTHIS'. –

ответ

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 окажется равным нулю.

Когда вы сравниваете символы нижнего регистра, вам необходимо использовать jge и jle.

Эта инструкция mov bh,[bx] уничтожает ваш указатель BX. Лучше использовать AL вместо BH.

Настоящая инструкция mov string3+2, bh не имеет смысла! Даже если он выполняет компиляцию, он всегда будет храниться в том же месте.

Смежные вопросы