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

如何仅使用64bit寄存器将1byte值存储在64bit寄存器中?

程卓君
2023-03-14

我需要只使用%RAX、%RBX、%RCX、%RDX、%RSI和%RDI(还有%RSP和%RBP)编写像素化汇编代码

*temp = b;
*(temp + 1) = g;  
*(temp + 2) = r;

GCC编写的程序集代码:

movq    -48(%rbp), %rax  
movl    %eax, %edx
movq    -16(%rbp), %rax  
movb    %dl, (%rax)      
movq    -16(%rbp), %rax  
addq    $1, %rax
movq    -56(%rbp), %rdx  
movb    %dl, (%rax)
movq    -16(%rbp), %rax
addq    $2, %rax
movq    -64(%rbp), %rdx  
movb    %dl, (%rax)

已将%dl更改为%rdx:

movq    -16(%rbp), %rax
movq    -48(%rbp), %rdx
movzbq  (%rdx), %rbx
movq    %rbx, (%rax)
movq    -16(%rbp), %rax
addq    $1, %rax
movq    -56(%rbp), %rdx
movzbq  (%rdx), %rbx
movq    %rbx, (%rax)
movq    -16(%rbp), %rax
addq    $2, %rax
movq    -64(%rbp), %rdx
movzbq  (%rdx), %rbx
movq    %rbx, (%rax)

共有1个答案

钦高峯
2023-03-14

我觉得你想做的事情是:

 t = r & 0xff;
 u = *temp & ~ 0xfful;
 *temp = u | t;
 t = (g & 0xff) << 8;
 u = *temp & ~ 0xff00ul;
 *temp = u | t;
 t  = (b & 0xff) << 16; 
 u = *temp & ~0xff00000ull;
 *temp = u | t;

您应该只能用64bit regs来写这个。你也应该能够找到一大堆的方法,使这种方式比这更小。

 类似资料:
  • Vim提供了许多寄存器。可以将这些寄存器用作多个剪贴板。使用多个文件时,此功能非常有用。在本章中,将讨论以下主题内容 - 复制寄存器中的文本 粘贴寄存器中的文本 列出可用的寄存器 寄存器类型 1. 复制寄存器中的文本 对于复制,可以使用普通的命令,即并将其存储在寄存器中,可以使用以下语法 - 例如,要复制寄存器中的文本,请使用以下命令 - 2. 粘贴寄存器中的文本 从寄存器粘贴文本 - 例如,下面

  • 当前的Perl 5虚拟机是一台堆栈机器。 它通过将操作保持在堆栈上来传递操作之间的值。 操作将值加载到堆栈上,执行他们需要执行的操作并将结果放回堆栈。 这很容易使用,但速度很慢。 要将两个数字相加,您需要执行三次堆栈推送和两次堆栈弹出。 更糟糕的是,堆栈必须在运行时增长,这意味着在您不想分配内存时分配内存。 因此,Parrot将打破虚拟机的既定传统,并使用寄存器架构,更类似于真实硬件CPU的架构。

  • 处理器操作主要涉及处理数据。 该数据可以存储在存储器中并从其上访问。 然而,从存储器读取数据和将数据存储到存储器中会降低处理器的速度,因为它涉及通过控制总线向存储器存储单元发送数据请求并通过相同通道获取数据的复杂过程。 为了加速处理器操作,处理器包括一些内部存储器存储位置,称为registers 。 寄存器存储数据元素以便处理而无需访问存储器。 处理器芯片内置有限数量的寄存器。 处理器寄存器 IA

  • 80386中应用程序员感兴趣的有16个寄存器。如图2-5所示,这些寄存器被分成以下几个基本类型: 1.通用寄存器。这些32为通用寄存器主要用来数学和逻辑运算。 2.段寄存器。这些特殊目的寄存器允许系统软件设计者选择平坦模式或是段模式。这六个寄存器决定了,任何时候,哪段存储器可以被寻址。 3.状态和指令寄存器。这些特殊目的寄存器用于记录和改变80386处理器状态的一些特征。 2.3.1 通用寄存器

  • 如何在按钮标题中使用小字母?我正在res/values/strings中创建字符串。带有注册表的xml,但仍有上限。

  • 我想知道如何从ASM指令中提取寄存器值,并将其放入C中的变量中。 例如:移动文档 DWORD PTR DS:[ESI],EDI (假设EDI持有的值为int)int value=EDI;