我正在制作一個程式,可以逆轉用戶給定的字串。 出現的問題是,如果字串的長度為5個位元組,則程式運行良好,但如果字串的長度較小,則當我執行它時,結果不會出現。另一個問題是,如果字串的長度超過5個位元組,它只反轉了前5個位元組。
請記住,我是匯編的新手,這個問題可能很基本,但如果有人告訴我問題出在哪里,我將非常感激。
謝謝大家,祝大家有一個美好的一天:)
P>檔案中的內容是:"我想知道,你是怎么做到的?
P.S 檔案 "training. inc "是一個實作了 "print_str, read_line "方法的檔案。
條目開始
包括 "win32a.inc"
MAX_USER_STR = 5h
section '.data' 資料可讀可寫
enter_string db "輸入一個字串:", 0
換行 db 13,10,0
user_str db MAX_USER_STR dup(?), 0
部分 ".text" 代碼 可讀 可執行
開始。
mov esi, enter_string
呼叫print_str
mov edi, user_str
呼叫 read_line
呼叫str_len
mov edx, MAX_USER_STR
mov ebx, 0
mov ecx, 0
mov esi, user_str
呼叫print_str
mov esi, newline
呼叫print_str
mov esi, user_str
for_loop :
push eax
mov al, byte[esi]
inc esi
inc ebx
呼叫print_eax
cmp edx, ebx
jb clear_register
jmp for_loop
for_loop2 :
呼叫 print_eax
mov byte[esi], al
inc esi
inc ecx
pop eax
cmp ecx, edx
ja break_loop
jmp for_loop2
break_loop:
;mov edi, 0
mov esi, user_str
呼叫print_str
推0
呼叫 [ExitProcess]
清除注冊表。
mov esi, user_str
jmp for_loop2
str_len :
push ecx
sub ecx, ecx
mov ecx, -1
sub al, al
cld
repne scasb
否定ecx
sub ecx, 1
mov eax, ecx
pop ecx
ret
包括'training.inc'。
uj5u.com熱心網友回復:
MAX_USER_STR = 5h
名字MAX_已經說了,但是要根據最壞的情況來定義一個緩沖區。如果你希望能夠處理可能長于5個字符的字串,那么就提高這個值。
MAX_USER_STR = 256 ; 一個合適的緩沖區
......如果字串更小,那么當我執行它時,結果就不會出現。 另一個問題是,如果字串的長度超過了5個位元組,那么它只反轉了前5個位元組。
這是因為你的代碼實際上沒有使用字串的長度,而是使用較小的緩沖區的大小。我希望你看到,這種情況不應該發生,溢位緩沖區。你的代碼沒有抱怨太多,因為這個緩沖區是資料部分的最后一個專案。 你的回圈可以使用真實的長度,如果你寫:
call str_len ; -> EAX
mov edx, eax
for_loop : push eax mov al, byte[esi]
如果你想推送的是字符,那么我希望push eax能跟隨字串的加載!
。
請注意,在一個字串反轉中,你永遠不會想把字串的結束符移到字串的前面。
這是你通過堆疊進行的基本的字串反轉:
mov ecx, edx ; EDX有StrLen
mov esi, user_str
loop1:
movzx eax, byte [esi].
inc esi
push eax
dec ecx
jnz loop1
mov esi, user_str
loop2:
pop eax
mov [esi], al
inc esi
dec edx
jnz loop2
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/320402.html
標籤:
