Arrays 在x86汇编中实现toupper函数

Arrays 在x86汇编中实现toupper函数,arrays,assembly,x86,ascii,Arrays,Assembly,X86,Ascii,我正在VS2012中使用x86汇编,试图将一些旧代码转换为汇编。我遇到的问题是访问和更改数组值(值是字符),我不知道如何执行。我加入了一些评论,这样你们就可以看到我的思考过程 void toUpper(char *string) { __asm{ PUSH EAX PUSH EBX PUSH ECX PUSH EDX PUSH ESI PUSH EDI MOV EBX, string MOV ECX, 0 //

我正在VS2012中使用x86汇编,试图将一些旧代码转换为汇编。我遇到的问题是访问和更改数组值(值是字符),我不知道如何执行。我加入了一些评论,这样你们就可以看到我的思考过程

    void toUpper(char *string) {
    __asm{

    PUSH EAX
    PUSH EBX
    PUSH ECX
    PUSH EDX
    PUSH ESI
    PUSH EDI

    MOV EBX, string
    MOV ECX, 0 // counter
    FOR_EXPR: // for loop
    CMP EBX, 0 //compare ebx to 0
    JLE END_FOR // if ebx == 0, jump to end_for
    CMP EBX, 97 // compare ebx to 97
    JL ELSE // if  ebx < 97, jump else
    CMP EBX, 122 // compare ebx to 122
    JG ELSE // if ebx > 122, jump else

    // subtract 32 from current array value
    // jump to next element

    JMP END_IF

    ELSE:
    // jump to next element

    END_IF:
    JMP FOR_EXPR

    END_FOR:


    POP EDI
    POP ESI
    POP EDX
    POP ECX
    POP EBX
    POP EAX

       }
    }
void toUpper(字符*字符串){
__asm{
推送EAX
推EBX
推ECX
推式EDX
推动ESI
推式电子数据交换
MOV EBX,字符串
MOV ECX,0//计数器
FOR_EXPR://FOR循环
CMP EBX,0//将EBX与0进行比较
JLE END_FOR//如果ebx==0,则跳到END_FOR
CMP EBX,97//将EBX与97进行比较
JL ELSE//如果ebx<97,则跳转ELSE
CMP EBX,122//将EBX与122进行比较
JG ELSE//如果ebx>122,跳转ELSE
//从当前数组值中减去32
//跳转到下一个元素
JMP END_IF
其他:
//跳转到下一个元素
如果:
JMP FOR_EXPR
结束:
流行电子数据交换
波普ESI
波普EDX
波普ECX
流行电子束
波普EAX
}
}

非常感谢您的帮助

在我看来,基本的问题是,您正在加载带有字符串地址的EBX,但是尝试使用它,就好像它包含字符串中的一个字节的数据一样

我可能会做一些不同的事情。我可能会将字符串的地址加载到ESI中,并使用它间接读取字符串的内容

    mov esi, string
next_char:
    lodsb
    test al, al     ; check for end of string
    jz done      
    cmp al, 'a'     ; ignore unless in range
    bl next_char
    cmp al, 'z'
    bg next_char
    sub al, 'a'-'A' ; convert to upper case         
    mov [esi-1], al ; write back to string
    jmp next_char

您可以使用EBX来代替ESI,但ESI更为惯用。您还可以使用一些技巧对此进行一些优化,但在您了解基本知识之前,这些技巧通常会增加混乱。使用现代处理器,它们可能不会有太大的区别——不管怎样,它的运行速度可能与内存带宽一样快。

啊,好的,谢谢你的回答:)另外,如何在程序集中反引用指针?代码显示了两种最常见的方法
lodsb
esi
指向的地址隐式加载
al
,然后递增
esi
mov[esi-1],al
al
移动到
esi
中保存的地址(在本例中为负一)。