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