0

可能重复:
x86 转换为小写程序集

该程序是将二维字符数组转换为小写 Quickie 编辑:我正在使用 Visual Studio 2010

int b_search (char list[100][20], int count, char* token)
{
__asm
{
    mov eax, 0          ; zero out the result
mov esi, list       ; move the list pointer to ESI
mov ebx, count      ; move the count into EBX
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 指令中,我试图将包含要标记的地址的寄存器更改为全部小写,我不断收到未处理的异常......访问冲突,并且没有括号,任何内容都不会小写。稍后在我的代码中

LOWERCASE_ARRAY:        ;for(edi = 0, edi<ebx; edi++), loops through each name
CMP ecx, ebx
JGE COMPARE
INC ecx             ;ecx++
MOV edx, 0;         ;edx = 0

LOWERCASE_STRING:       ;while next char != 0, loop through each byte to convert to lower case
OR [esi+edx],20h    ;change to lower case
INC edx
CMP [esi+edx],0     ;if [esi+edx] not zero, loop again
JNZ LOWERCASE_STRING
JMP LOWERCASE_ARRAY ;jump back to start case change of next name

并且OR那里的指令似乎工作得很好,所以我不知道为什么第一个不起作用。另外,我正在尝试转换几个字符串。

在我完成一个字符串后,任何想法我将如何进入下一个字符串(如list[1][x],list[2][x]等...)我尝试添加 20 ,[esi+20*ecx+edi]但这不起作用。我可以就如何进行获得建议吗?

4

1 回答 1

0

一种可能:

如果过程的参数b_search存储为寄存器(寄存器调用约定),那么您list在第一行 asm 中覆盖指针,因为 eax 指向list数组:

mov eax, 0          ; zero out the result

因为:

mov esi, list       ; move the list pointer to ESI

应转换为:

mov esi, eax

尝试将第一行和第二行交换为:

mov esi, list       ; move the list pointer to ESI
mov eax, 0          ; zero out the result
于 2012-07-25T16:44:03.477 回答