2012-07-25 79 views
-1

該程序將char指針轉換爲小寫。我正在使用Visual Studio 2010.x86轉換爲小寫彙編

這是來自另一個問題,但更簡單的閱讀和更直接的點。

int b_search (char* token) 
{ 
__asm 
{ 
mov eax, 0   ; zero out the result 
mov edi, [token]  ; move the token to search for into EDI 
MOV ecx, 0 

LOWERCASE_TOKEN:   ;lowercase the token 
OR [edi], 20h 
INC ecx 
CMP [edi+ecx],0 
JNZ LOWERCASE_TOKEN 
MOV ecx, 0 

在我或指令,在那裏我試圖改變包含地址令牌到所有較低的情況下,我不斷收到未處理的異常...訪問衝突,沒有括號什麼寄存器,我不要犯錯誤,但不要小看。有什麼建議? 這是來自另一個問題的一些更大的代碼的一部分,但我分手了,因爲我只需要這個解決方案。

+0

你有使用匯編?已經有'tolower(char)'。 – chris 2012-07-25 18:45:12

+0

建議?調試你的代碼。首先,你是否在'edi'中獲得'token'的值? – 2012-07-25 18:47:13

+0

@chris它的功課問題,所以可能。 – Wug 2012-07-25 18:47:19

回答

0

您的代碼只能更改第一個字符(或[edi],20h) - EDI不會增加。

編輯:找到了this thread與解決方法。嘗試使用'dl'而不是al。

; move the token address to search for into EDI 
; (not the *token, as would be with mov edi, [token]) 

mov edi, token  

LOWERCASE_TOKEN:   ;lowercase the token 
    mov al, [edi] 
    ; check for null-terminator here ! 
    cmp al, 0 
    je GET_OUT 
    or al, 20h 
    mov dl, al 
    mov [edi], dl 
    inc edi 
jmp LOWERCASE_TOKEN 
GET_OUT: 
+0

我從字面上複製並粘貼了你的代碼,因爲我想看看它是否有效,但這不是因爲第二次我碰到了'mov [edi],我的代碼對着我大叫。 「al」的值確實是小寫字母,但無論出於何種原因,我不能再次使用[edi]。第一次經歷,但第二個'[edi]'我被大喊大叫。 – gooberdope 2012-07-25 19:22:57

+0

@gooberdope你的代碼對你大喊大叫?我認爲你應該在編程環境中更具體。 – 2012-07-25 19:34:49

+0

@AlexeyFrunze就像我在我原來的問題中說的,我得到一個未處理的異常/訪問衝突錯誤。這是我的電腦對我說的。 – gooberdope 2012-07-25 19:50:53

0

我將在數據加載到寄存器中,操作它那裏,然後將結果存儲回存儲器。

int make_lower(char* token) { 
    __asm { 
     mov edi, token 
     jmp short start_loop 
    top_loop: 
     or al, 20h 
     mov [edi], al 
     inc edi 
    start_loop: 
     mov al, [edi] 
     test al, al 
     jnz top_loop 
    }  
} 

但是,請注意,您轉換爲大寫字體時有點不妥。例如,如果輸入包含任何控制字符,它會將它們更改爲其他內容 - 但它們不是大寫字母,它將它們轉換爲的不會是小寫字母。

0

問題是,OR運算符像許多其他運算符不允許兩個內存或常量參數。這意味着:該OR運算符只能有下列參數:

OR register, memory 
OR register, register 
OR register, constant 

第二個問題是,該OR具有將結果存儲到寄存器,而不是存儲器。 這就是爲什麼當你設置了方括號時你會遇到訪問衝突。如果刪除括號,參數就可以了,但是你不會將小寫字母寫到內存中,你打算做什麼。因此,使用另一個寄存器,將該字母複製到,然後使用OR。 例如:

mov eax, 0   ; zero out the result 
mov edi, [token]  ; move the token to search for into EDI 
MOV ecx, 0 
LOWERCASE_TOKEN:   ;lowercase the token 
MOV ebx, [edi]  ;## Copy the value to another register ## 
OR ebx, 20h   ;## and compare now the register and the memory ##  
MOV [edi], ebx  ;##Save back the result ##  
INC ecx  
CMP [edi+ecx],0  
JNZ LOWERCASE_TOKEN  
MOV ecx, 0 

這應該工作^^