我應該寫什么回圈 如果我想跳過字串開頭的所有空格并在我的代碼到達字串的第一個符號時開始對字串執行某些操作。如果我有一個像
a=' s o m e word'
代碼應該在到達 's' 時開始。它應該是某種回圈,但我仍然不知道如何正確撰寫它。
我的嘗試:
mov si, offset buff 2 ;buffer
mov ah, [si]
loop_skip_space:
cmp ah,20h ;chech if ah is space
jnz increase ;if yes increase si
jmp done ;if no end of loop
increase:
inc si
loop loop_skip_space
done:
uj5u.com熱心網友回復:
看例子
STRLEN EQU 9
STRING DB 'Assembler'
CLD ;clear direction flag
MOV AL,' ' ;symbol to find.
MOV ECX,STRLEN ;length of string
LEA EDI,STRING ;string pointer.
REPE SCASB ;search itself
JNZ K20 ;jump if not found
DEC EDI ;
; EDI points to your first not space char
K20: RET
uj5u.com熱心網友回復:
在這個 16 位代碼中,它在 處獲取其字串偏移量buff 2,我相信考慮這個字串屬于從執行DOS.BufferedInput 函式 0Ah獲得的輸入是一個安全的賭注。
下面的代碼片段基于此假設。無論如何,關于 OP 代碼的下一個觀察仍然有效。
- 的
mov ah, [si]必須是回圈的一部分。您需要驗證字串中的不同字符,因此需要加載以下位元組。 - 您的代碼應在找到非空格字符后退出回圈。目前您在第一個空間退出。
- 該
loop指令需要CX使用字串的長度設定暫存器。你忽略了這一點。
mov si, offset buff 2
mov cl, [si-1]
mov ch, 0
jcxz done ; String could start off empty
loop_skip_space:
cmp byte ptr [si], ' '
jne done
inc si ; Skip the current space
loop loop_skip_space
done:
這里SI指向字串中的第一個非空格字符,CX剩余字符。CX可能為零!
如果您停止使用該loop指令,您可以撰寫更好的代碼,因為它是一條被稱為速度較慢的指令。請參閱為什么回圈指令很慢?英特爾不能有效地實施它嗎?.
- 避免
loop并且不再需要使用CX
mov si, offset buff 2
mov cl, [si-1]
test cl, cl
jz done ; String could start off empty
loop_skip_space:
cmp byte ptr [si], ' '
jne done
inc si ; Skip the current space
dec cl
jnz loop_skip_space
done:
- 避免
loop和使用分隔符 13(回車)
mov si, offset buff 1
loop_skip_space:
inc si
cmp byte ptr [si], ' '
je loop_skip_space
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/357368.html
上一篇:在C 代碼的VS反匯編中,“dwordptr[this]”是什么意思?
下一篇:MSP430中的進位標志混淆
