当前位置: 首页 > 知识库问答 >
问题:

在内联汇编代码中保存和还原寄存器

苍德寿
2023-03-14

我正在为一个操作系统分配编写内联汇编代码。我有一些关于内联汇编和gcc编译器将其转换为机器代码的问题。

    null

共有1个答案

公良弘毅
2023-03-14

编译器有一个复杂的寄存器分配策略,它用于内联asm,就像它用于自己生成的代码一样。它可以为满足约束的asm参数使用任何寄存器或其他位置,因此很难预测可能使用哪些寄存器,并且高度依赖于周围的代码。

编译器通过将被编译代码所需的其他值放入其他寄存器或溢出到内存来确保这些值得以保留。程序员不必担心这一点。

 类似资料:
  • 本文向大家介绍汇编语言 寄存器内存访问原理解析,包括了汇编语言 寄存器内存访问原理解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了汇编语言 寄存器内存访问原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在内存中字的存储 这段话的主要意思是:一个字=2B=16bit,CPU中是用两个内存单元储存一个字(假如获取0地址存放的字

  • 问题内容: 我正在编写自动化脚本(/ )。他们中的许多人都受益于一些基本的终端GUI。我想我会使用标准序列进行基本绘图。在绘制终端之前,我会这样做,但是这样做会丢失一些终端命令历史记录。我希望能够在程序存在时还原终端命令历史记录。许多终端程序(例如,,,,,,等)这样做。所有这些都还原了终端窗口,从而使用户返回到先前执行过的所有命令历史的调用程序之前的位置。 老实说,我什至不知道从哪里开始搜索。是

  • 在wikipedia x86调用约定中,它说对于Microsoft x64调用约定: 寄存器RBX、RBP、RDI、RSI、RSP、R12、R13、R14和R15被视为非易失性(被叫方保存)。 但对于System V AMD64 ABI: 如果被调用方希望使用寄存器RBX、RBP和R12-R15,则必须在将控制权返回给调用方之前恢复它们的原始值。 我的问题是,在不同的平台上调用约定是不是不同的?(

  • 我看到的问题是,当我将内联asm改为直接在输出寄存器上工作时,它会中断,而不是使用r16进行计算,最后将r16移动到输出寄存器中。代码在这里:http://ideone.com/jtpyma。它将结果打印成串行,您只需要定义F_CPU和baud。该问题仅在使用GCC-4.8.0而不使用GCC-4.7.2时才出现。 [1]http://www.nongnu.org/avr-libc/user-man

  • 本文向大家介绍汇编语言之寄存器详解,包括了汇编语言之寄存器详解的使用技巧和注意事项,需要的朋友参考一下 上图是cpu中三个组成部分:寄存器 运算器 控制器。其中寄存器是cpu中程序员用指令读取的唯一部件(调剂界面中的 寄存器窗口)。如果是16位cpu,就是处理,传输,暂时存储的数据长度都是16位。所以16位的cpu,寄存器也是16位。《汇编语言》这本书中使用的是16位寄存器位例子来讲的,所以下面的

  • 问题内容: Go代码中可以包含内联汇编吗? 问题答案: 不支持内联汇编,但是您可以链接通过C用汇编语言编写的代码,使用cgo进行编译和使用,例如gmp.go中的代码。您也可以使用与Go直接兼容的汇编样式来编写,例如asm_linux_amd64.s中,它要求函数名称以“·”开头。 或者,您可以使用nasm和gccgo,这是我到目前为止最喜欢的方法。(请注意,Nasm似乎不支持以“·”开头的功能)。