C x86转换为小写程序集
此程序用于将C x86转换为小写程序集,c,x86,inline-assembly,C,X86,Inline Assembly,此程序用于将char指针转换为小写。我正在使用VisualStudio2010 这是另一个问题,但阅读起来更简单,更直接 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: ;lowerc
char
指针转换为小写。我正在使用VisualStudio2010
这是另一个问题,但阅读起来更简单,更直接
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指令中,当我试图将包含要令牌的地址的寄存器更改为所有小写时,我不断得到未处理的异常…访问冲突,没有括号,没有任何内容,我不会得到错误,但没有任何内容是小写的。有什么建议吗?
这是另一个问题中一些更大代码的一部分,但我将其分解,因为我只需要此解决方案。您的代码只能更改第一个字符(或[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:
我会将数据加载到寄存器中,在那里进行操作,然后将结果存储回内存
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
}
}
然而,请注意,您对大写的转换有些缺陷。例如,如果输入包含任何控制字符,它会将它们更改为其他字符——但它们不是大写,并且它将它们转换为的不会是小写。问题是,OR运算符和其他许多运算符一样,不允许使用两个内存或常量参数。这意味着:OR运算符只能具有以下参数:
OR register, memory
OR register, register
OR register, constant
第二个问题是,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
那应该行^ ^你必须使用汇编吗?已经有
tolower(char)
。建议?调试代码。首先,您是否在edi
中获取token
的值?@chris这可能是一个家庭作业问题。我认为您的第二行应该是MOV edi,token
,因为token
是一个指针,所以它包含第一个字符的地址。“Jon”可能位于只读内存中。尝试char[]token=“Jon”
初始化堆栈上的字符数组,或者分配空间和strcpy()。我复制并粘贴了你的代码,因为我想看看它是否有效,但没有,因为我第二次点击mov[edi],al
我的代码就冲我大喊大叫。al
的值实际上是小写的,但不管出于什么原因,我不能第二次使用[edi]。第一次它通过了,但是第二次我被骂了。@gooberdope你的代码对你大喊大叫?我认为您应该在编程环境中更加具体。@AlexeyFrunze正如我在最初的问题中所说,我遇到了一个未处理的异常/访问冲突错误。这就是我的电脑对我吼叫的内容。@ViktorLatypov也不工作。我总是在我的EIP地址收到一个未处理的异常,在我的EDI地址收到一个访问冲突错误