x86转换为小写程序集

时间:2012-07-25 18:43:11

标签: c x86 inline-assembly

该程序将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指令中,我正在尝试将包含地址的寄存器更改为全部小写,我一直得到未处理的异常...访问冲突,并且没有括号,我没有得到错误,但没有任何东西变低。有什么建议? 这是另一个问题的一些更大代码的一部分,但我把它分解了,因为我只需要这个解决方案。

3 个答案:

答案 0 :(得分: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:

答案 1 :(得分: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
    }       
}

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

答案 2 :(得分: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

那应该有效^^