Arrays 在x86汇编中实现toupper函数
我正在VS2012中使用x86汇编,试图将一些旧代码转换为汇编。我遇到的问题是访问和更改数组值(值是字符),我不知道如何执行。我加入了一些评论,这样你们就可以看到我的思考过程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 //
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
中保存的地址(在本例中为负一)。