X86&&X64 汇编学习——内联基础

本文通过对比32位与64位汇编指令及寄存器的变化,介绍了如何在C语言中使用X64汇编进行内嵌操作,包括访问全局变量、使用寄存器、替换占位符及寄存器破坏等技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

现在已经进入了64位时代,但是几乎所有的汇编教程道还停留在16位,32位上。总是让人用起来有种脱轨的感觉,诚如上面所言,我们很难很难找到讲授X64汇编的文档,手册,甚至教程。

但是我还是需要使用的,没办法需要自己慢慢查资料摸索。最近在回顾X86的内嵌汇编,所以想着在做32位内嵌汇编的同时学习64位汇编。

X64汇编的学习你至少要知道X86 32位汇编的基础知识。

在C语言中内嵌汇编访问全局变量

X86  

#include<stdio.h>

int a = 10;
int b = 20;

int result;

int main(){
    
    __asm__ __volatile__ ("movl a, %eax\n\t"
                          "movl b, %ebx\n\t"
                          "imull %ebx,%eax\n\t"
                          "movl %eax,result\n\t"
                          );
    printf("the answer is %d\n",result);
    return 0;

}

这段程序的目的用result 来保存 a 与 b 的乘积,典型的X86用法。我们再来看看X64的用法:

#include<stdio.h>

int a = 10;
int b = 20;

int result;

int main(){
    
    __asm__ __volatile__ ("movq a, %rax\n\t"
                          "movq b, %rbx\n\t"
                          "imulq %rbx,%rax\n\t"
                          "movq %rax,result\n\t"
                          );
    printf("the answer is %d\n",result);
    return 0;

}

首先指令上:movl   --->  movq  转变成了64位指令 imull   --->  imulq 其次看寄存器: e*x   --->   r*x   32位寄存器转换成空了64位寄存器

扩展ASM

__asm__ __volatile__("assembly code":output locations : input locations : changed registers); 汇编代码,输出代码,输入代码,修改寄存器/破坏性描述

 使用寄存器

在使用寄存器的时候,我们需要注意的是:内存和寄存器交互使用,需要用“%”转义寄存器。64位下随机选择寄存器使用“g"参数。 例如我们将变量b的值赋值给变量a.

#include<stdio.h>


int main(){

    int a = 10;
    int b = 20;
    __asm__ __volatile__("movq %1,%%rbx\n\t"
                         "movq %%rbx,%0":"=m"(a):"g"(b));
    printf("a = %d\n",a);

}

替换占位符

简单来说就是做了标记,使用[] 给变量起一个别名

#include<stdio.h>


int main(){

    int a = 10;
    int b = 20;
    __asm__ __volatile__("movq %[name_a],%%rbx\n\t"
                         "movq %%rbx,%[name_b]":[name_b]"=m"(a):[name_a]"g"(b));
    printf("a = %d\n",a);

}

效果和之前时一样的。

寄存器破坏

如果使用再输入输出中没有声明但是已经使用的寄存器,需要在破坏描述符部分说明:

#include<stdio.h>


int main(){
    
    int data1  = 10;
    int result = 20;
    __asm__ __volatile__("movq %1,%%rax\n\t"
                         "movq %%rax,%0":"=m"(result):"g"(data1):"%rax");
    printf("result = %d\n",result);


}

内联跳转,宏一样处理。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值