【问题标题】:how to use parameters of function C to rotate right in Assembly code [duplicate]如何在汇编代码中使用函数C的参数向右旋转[重复]
【发布时间】:2020-10-02 23:05:11
【问题描述】:

为什么从 C 调用函数 Assembly 时我不能在汇编代码的 ror 处使用 rsi

出现错误:操作码和操作数的组合无效

帮帮我谢谢

汇编代码:

section .text
   global  en_code
en_code:
    mov ax,[rdi]
    ror ax,rsi ;????
    mov [r13],ax
    mov rax,r13
    ret

C 代码:

#include<stdio.h>
#include<string.h>
extern char* en_code();
int main()
{
    printf("Here:%s .\n",en_code("ng",2));
    return 0; 
}

【问题讨论】:

  • 如果您坚持将 16 位输入通过内存中的引用而不是在寄存器本身中返回为一个 uint16_t。 r13 不用于 x86-64 System V 中的参数传递,IDK 为什么您要从源字符串加载并通过 R13 存储。
  • 另外,您不需要 asm 来获取旋转指令。 C 编译器可以发出它们:Best practices for circular shift (rotate) operations in C++
  • 我没有组装经验并尝试做一些简单的例子

标签: c assembly x86-64 bit-shift


【解决方案1】:

唯一需要两个寄存器的 ROR 组合要求移位计数在 CL 中。您可以旋转寄存器或内存操作数,但移位计数必须是立即数或在 CL 中传递。

来自RCL/RCR/ROL/ROR — Rotate

(英特尔语法):

REX.W + D3 /1 | ROR r/m64, CL | MC | Valid | N.E. | Rotate 64 bits r/m64 `right CL times. Uses a 6 bit count. |`  

【讨论】:

  • 谢谢,但是我有从 C 传下来的参数,它的值存储在 RSI 中,所以我怎样才能将它传递给 CL,我试过 / mov CL, [RSI] / 但它没有不行。
猜你喜欢
  • 2020-06-06
  • 2021-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-07
  • 2017-02-18
  • 1970-01-01
  • 2011-09-04
相关资源
最近更新 更多