Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C x86转换为小写程序集_C_X86_Inline Assembly - Fatal编程技术网

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地址收到一个访问冲突错误