【问题标题】:x86 assembly programmingx86 汇编编程
【发布时间】:2014-02-03 04:57:48
【问题描述】:

我正在尝试实现一个函数,它现在将小写字母转换为大写字母,而不影响标点符号或数字。但这段代码似乎不起作用。请帮忙谢谢!

void capital(char *x)
{
  __asm
  {
    PUSH EAX
    PUSH EBX
    PUSH ECX
    PUSH EDX
    PUSH ESI
    PUSH EDI

    mov ebx, string

next_char:
    lodsb
    test al, al
    jz done
    cmp al, 'a'
    bl next_char
    cmp al, 'z'
    bg next_char
    sub al, 'a'-'A'
    mov [esi-1], al
    jmp next_char

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

【问题讨论】:

  • 在高级语言中使用内联汇编有充分的理由吗?
  • 你能修复你的粘贴并添加“完成”标签吗? (或者这是问题所在?:D)
  • 相关问题请在这里搜索,类似的问题很多:here and here and here.
  • 你用的是什么编译器?
  • blbg 指令有效吗?我愿意假设汇编器决定 bg 是一个标签(如果您没有启用足够的警告),但 bl 是一个寄存器名称,不应该被(英特尔语法)汇编器接受.

标签: assembly x86


【解决方案1】:

这里询问了相同的家庭作业:X86 Assembly Converting lower-case to uppercase

1) Instead of moving the string address to EBX it should be moved to ESI, where LODSB will read it from implicitly.
2) bl, bg are not valid x86 instructions, use JL, JG instead.
3) Label done is not defined in your code, it should go just in front of POP EDI.

【讨论】: