原来add指令可以直接对内存进行加法操作

一直以为一个简单的i++操作,会变成三条会变指令:
1. 加载内存内容到寄存器
2. 对寄存器进行加法操作
3. 写回内存

然而事实上,add指令的操作对象,可以直接是内存的内容,这里有相关的说明:http://x86.renejeschke.de/html/file_module_x86_id_5.html

示例代码如下:

    int count = 20;

    asm(
        "addl $80, %0 \n"
        : : "m" (count) :);

    printf("%d\n", count);

汇编之后的结果:

    movl    $20, -4(%rbp)
    addl    $80, -4(%rbp)

movl $20, -4(%rbp)是对count进行赋值,后面的addl便是直接对其+80。

如果按照先加载到寄存器再操作的写法:

    asm(
        "addl $80, %0 \n"
        : "+r"(count) : :);
    printf("%d\n", count);

汇编之后是:

    movl    -4(%rbp), %eax
    addl    $80, %eax
    movl    %eax, -4(%rbp)

就是常见的3条指令的形式了。

时间: 2024-12-02 02:14:35

原来add指令可以直接对内存进行加法操作的相关文章

ARM指令寻址方式之: 内存访问指令寻址

4.2  内存访问指令寻址 根据内存访问指令的分类,内存访问指令的寻址方式可以分为以下几种. ① 字及无符号字节的Load/Store指令的寻址方式. ② 杂类Load/Store指令的寻址方式. ③ 批量Load/Store指令的寻址方式. ④ 协处理器Load/Store指令的寻址方式.   4.2.1  字及无符号字节的Load/Store指令的寻址方式 字及无符号字节的Load/Store指令语法格式如下:   LDR|STR{<cond>}{B}{T}  <Rd>,<

httpd.exe - 应用程序错误: 0x0075d315 指令引用的 0x065bd810 内存

事件类型: 信息 事件来源: Application Popup 事件种类: 无 事件 ID: 26 日期:  2013-3-21 事件:  11:22:28 用户:  N/A 计算机: 123-D7455DB0681 描述: 弹出应用程序: httpd.exe - 应用程序错误: "0x0075d315" 指令引用的 "0x065bd810" 内存.该内存不能为 "read". 要终止程序,请单击"确定". 要调试程序,请单

Apache报错 0x6eec38dc 指令引用的 0x00000000 内存不能为 read

启动Apache报错"0x6eec38dc"指令引用的"0x00000000"内存.该内存不能为"read". 原因是:配置过httpd.conf,添加了一个指向移动硬盘的网站配置.  代码如下 复制代码 <VirtualHost *:80>         DirectoryIndex   index.html index.php         ServerName   "www.sjolzy.cn"     

httpd.exe - 应用程序错误: 0x6eecd0c3 指令引用的 0x00000004 内存

httpd.exe - 应用程序错误 --------------------------- "0x01191ffd" 指令引用的 "0xffffffff" 内存.该内存不能为 "read". 要终止程序,请单击"确定". 要调试程序,请单击"取消". --------------------------- 确定   取消   安装完后,打开普通php文件正常,而打开连接数据库的php文件出现 httpd.

UC编程9-管道pipe操作和共享内存段shm操作

//myuc.h #include<stdio.h>//io流 #include<stdlib.h>//标准库 #include<unistd.h>//uc标准头文件 #include<fcntl.h>//文件控制 #include<string.h>//c字符串 #include<sys/types.h> #include<sys/mman.h>//内存映射 #include<sys/stat.h>//文件状

iOS逆向工程之Hopper中的ARM指令

虽然前段时间ARM被日本软银收购了,但是科技是无国界的,所以呢ARM相关知识该学的学.现在看ARM指令集还是倍感亲切的,毕竟大学里开了ARM这门课,并且做了不少的实验,当时自我感觉ARM这门课学的还是可以的.虽然当时感觉学这门课以后似乎不怎么用的上,可曾想这不就用上了吗,不过之前学的都差不多忘了,还得捡起来呢.ARM指令集是精简指令集,从名字我们就能看出指令的个数比那些负责指令集要少一些.当然本篇所涉及的ARM指令集是冰山一角,不过也算是基础,可以阅读Hopper中的汇编了,实践出真知,看多了自

iOS逆向工程之Hopper中的ARM指令详解_IOS

虽然前段时间ARM被日本软银收购了,但是科技是无国界的,所以呢ARM相关知识该学的学.现在看ARM指令集还是倍感亲切的,毕竟大学里开了ARM这门课,并且做了不少的实验,当时自我感觉ARM这门课学的还是可以的.虽然当时感觉学这门课以后似乎不怎么用的上,可曾想这不就用上了吗,不过之前学的都差不多忘了,还得捡起来呢.ARM指令集是精简指令集,从名字我们就能看出指令的个数比那些负责指令集要少一些.当然本篇所涉及的ARM指令集是冰山一角,不过也算是基础,可以阅读Hopper中的汇编了,实践出真知,看多了自

《逆向工程权威指南》—第3章3.4节ARM

3.4 ARM 根据我个人的经验,本书将通过以下几个主流的ARM编译器进行演示. 2013年6月版本的Keil编译器. Apple Xcode 4.6.3 IDE (含LLVM-GCC 4.2编译器) .[10] 面向 ARM64的GCC 4.9 (Linaro),其32位的Windows程序可由下述网址下载:http://www. linaro.org/ projects/armv8/. 除非特别标注,否则本书中的ARM程序都是32位ARM程序.在介绍64位的ARM程序时,本书会称其为ARM6

Lua中的metatable介绍_Lua

setmetatable (table, metatable) Lua 中的每个值都可以用一个 metatable. 这个 metatable 就是一个原始的 Lua table , 它用来定义原始值在特定操作下的行为. 你可以通过在 metatable 中的特定域设一些值来改变拥有这个 metatable 的值 的指定操作之行为. 举例来说,当一个非数字的值作加法操作的时候, Lua 会检查它的 metatable 中 "__add" 域中的是否有一个函数. 如果有这么一个函数的话,