x86程序集小写未处理的异常

时间:2012-07-25 16:31:25

标签: c x86 access-violation inline-assembly

  

可能重复:
  x86 convert to lower case assembly

该程序将2d char数组转换为小写 Quickie Edit:我正在使用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,如{{1但这不起作用。我可以获得有关如何进行的建议吗?

1 个答案:

答案 0 :(得分:0)

一种可能性:

如果过程b_search的参数存储为寄存器(寄存器调用约定),则覆盖第一个asm行中的list指针,因为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