-1

该程序是将char指针转换为小写。我正在使用 Visual Studio 2010。

这是另一个问题,但阅读起来更简单,也更直接。

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

在我的 OR 指令中,我试图将包含要标记的地址的寄存器更改为全部小写,我不断收到未处理的异常...访问冲突,并且没有括号,我没有收到错误但什么也没有小写。有什么建议吗?这是另一个问题的一些更大代码的一部分,但我把它分解了,因为我只需要这个解决方案。

4

3 回答 3

0

问题是,像许多其他运算符一样,OR 运算符不允许两个内存或常量参数。这意味着: OR 运算符只能具有以下参数:

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

第二个问题是,OR 必须将结果存储到寄存器,而不是内存。这就是为什么在设置括号时会出现访问冲突的原因。如果去掉括号,参数就ok了,但是你不把你的小写字母写到内存中,你打算做什么。所以使用另一个寄存器,将字母复制到,然后使用 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

那应该工作^^

于 2013-06-01T14:38:50.683 回答
0

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

编辑:找到这个线程的解决方法。尝试使用“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:
于 2012-07-25T19:15:31.443 回答
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
    }       
}

但是请注意,您转换为大写字母时存在一些缺陷。例如,如果输入包含任何控制字符,它会将它们更改为其他字符——但它们不是大写的,并且将它们转换为的字符也不会是小写。

于 2012-07-25T20:53:06.773 回答