Visual C++内联汇编 用户输字符串 实现字母大小写转换

uulol2023-04-22  22

#include <stdioh>

int main()

{

  char szStr[128];

  gets(szStr);

  __asm {

    jmp entry

  isletter1:

    cmp al, 'a'

    jl nex

    cmp al, 'z'

    jg nex

    mov ecx, 1

    ret

  isletter2:

    cmp al, 'A'

    jl nex

    cmp al, 'Z'

    jg nex

    mov ecx, 1

    ret

  nex:

    mov ecx, 0

    ret

  entry:

    lea edx, szStr

  loopStart:

    mov al, byte ptr ds:[edx]

    test al, al

    jz ed

    call isletter1

    test ecx, ecx

    jz test2

    sub byte ptr ds:[edx], 'a'-'A'

    jmp nextChar

  test2:

    call isletter2

    test ecx, ecx

    jz nextChar

    add byte ptr ds:[edx], 'a'-'A'

  nextChar:

    inc edx

    jmp loopStart

  ed:

  }

  puts(szStr);

  return 0;

}

根据您提供的代码,这是一个包含汇编指令的C程序。其中的汇编指令是使用GCC内联汇编语法嵌入到C代码中的。

您所说的“输出约束”通常是指将汇编指令执行结果写入C程序中的变量中。在这个例子中,确实没有在汇编代码中使用输出约束。

这是因为这段汇编代码并没有产生任何输出,它只是简单地将数组a中的每个元素乘以2,并将结果存储在数组b中。因此,在这种情况下,没有必要使用输出约束。

内联汇编使用“__asm”(C++)和“asm”(C和C++)关键字声明,语法格式如下所示,内联汇编支持大部分的ARM指令,但不支持带状态转移的跳转指令,如BX和BLX 指令

由于内联汇编嵌入在C或C++程序中,所有在用法上有其自身的一些特点。

① 如果同一行中包含多条指令,则用分号隔开。

② 如果一条指令不能在一行中完成,使用反斜杠“/”将其连接。

③ 内联汇编中的注释语句可以使用C或C++风格的。

④ 汇编语言中使用逗号“,”作为指令操作数的分隔符,所以如果在C语言中使用逗号必须用圆括号括起来。如,__asm {ADD x, y, (f(), z)}。

⑤ 内联汇编语言中的寄存器名被编译器视为C 或C++语言中的变量,所以内联汇编中出现的寄存器名不一定和同名的物理寄存器相对应。这些寄存器名在使用前必须声明,否则编译器将提示警告信息。

int f(int x)

{

    int r0;

    __asm

    {

        ADD r0, x, 1

        EOR x, r0, x

    }

    return x;

}

__asm

{

mov ax,num1

mov bx,num2

add ax,bx

mov num3,ax

}

这样结果 就给了 变量num3 乘法 mul 减法sub 除法 div 看一下汇编指令就可以了

简单的代码 没必要用汇编 来装一把

内联汇编

存在很多的问题

比如 你这个

mov eax,[0x004166C4] 他会在汇编代码里 自动翻译成

moveax,0x004166C4 省略了[]

如果想调用成功,需要这么写

mov eax,0x004166C4

mov eax,[eax]

就可以实现你要的效果了,望采纳,还有什么问题 可以关注

公众号 任鸟飞逆向

我们一起学习 讨论

以上就是关于Visual C++内联汇编 用户输字符串 实现字母大小写转换全部的内容,包括:Visual C++内联汇编 用户输字符串 实现字母大小写转换、这段gcc内联汇编代码为什么没有写输出约束、求助:在GCC嵌入汇编中如何使用C语言定义的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

转载请注明原文地址:https://juke.outofmemory.cn/read/3634269.html

最新回复(0)