这个只有一个操作数的 x86-64 addq 指令是什么意思? (摘自CSAPP书籍第三版)

2024-01-06

在下面的说明中,addq 是如何工作的?它只有一个操作数,书上声称它递增 %rdx,但 %rdx 不在这条指令中。我感到很困惑...

这是来自《计算机系统:程序员的视角》一书,第三版。


正如@Jester 在评论中指出的那样。这确实是一个错误。 我实际上输入了程序并在linux上使用gcc编译了它。下面是结果。

C程序:badcnt.c

/*
 * badcnt.c - An improperly synchronized counter program
 */
#include <stdlib.h>
#include <pthread.h>
#include <stdio.h>

void *thread(void *vargp);  /* Thread routine prototype */

/* Global shared variable */
volatile int cnt = 0; /* Counter */

int main(int argc, char **argv)
{
  int niters;
  pthread_t tid1, tid2;

  /* Check input argument */
  if (argc != 2) {
    printf("usage: %s <niters>\n", argv[0]);
    exit(0);
  }
  niters = atoi(argv[1]);

  /* Create threads and wait for them to finish */
  pthread_create(&tid1, NULL, thread, &niters);
  pthread_create(&tid2, NULL, thread, &niters);
  pthread_join(tid1, NULL);
  pthread_join(tid2, NULL);

  /* Check result */
  if (cnt != (2 * niters))
    printf("BOOM! cnt=%d\n", cnt);
  else
    printf("OK cnt=%d\n", cnt);
  exit(0);
}

/* Thread routine */
void *thread(void *vargp)
{
  int i, niters = *((int *)vargp);

  for (i = 0; i < niters; i++)
    cnt++;

  return NULL;
}

使用gcc 6.3.0编译

$ gcc -pthread -Og -S badcnt.c

以下是badcnt.s中的内容

        .file   "badcnt.c"
        .text
        .globl  thread
        .type   thread, @function
thread:
.LFB20:
        .cfi_startproc
        movl    (%rdi), %ecx
        movl    $0, %edx
        jmp     .L2
.L3:
        movl    cnt(%rip), %eax
        addl    $1, %eax
        movl    %eax, cnt(%rip)
        addl    $1, %edx
.L2:
        cmpl    %ecx, %edx
        jl      .L3
        movl    $0, %eax
        ret
        .cfi_endproc
.LFE20:
        .size   thread, .-thread
        .section        .rodata.str1.1,"aMS",@progbits,1
.LC0:
        .string "usage: %s <niters>\n"
.LC1:
        .string "BOOM! cnt=%d\n"
.LC2:
        .string "OK cnt=%d\n"
        .text
        .globl  main
        .type   main, @function
main:
.LFB19:
        .cfi_startproc
        subq    $40, %rsp
        .cfi_def_cfa_offset 48
        cmpl    $2, %edi
        je      .L5
        movq    (%rsi), %rsi
        movl    $.LC0, %edi
        movl    $0, %eax
        call    printf
        movl    $0, %edi
        call    exit
.L5:
        movq    8(%rsi), %rdi
        movl    $10, %edx
        movl    $0, %esi
        call    strtol
        movl    %eax, 28(%rsp)
        leaq    28(%rsp), %rcx
        movl    $thread, %edx
        movl    $0, %esi
        leaq    16(%rsp), %rdi
        call    pthread_create
        leaq    28(%rsp), %rcx
        movl    $thread, %edx
        movl    $0, %esi
        leaq    8(%rsp), %rdi
        call    pthread_create
        movl    $0, %esi
        movq    16(%rsp), %rdi
        call    pthread_join
        movl    $0, %esi
        movq    8(%rsp), %rdi
        call    pthread_join
        movl    28(%rsp), %eax
        addl    %eax, %eax
        movl    cnt(%rip), %edx
        cmpl    %edx, %eax
        je      .L6
        movl    cnt(%rip), %esi
        movl    $.LC1, %edi
        movl    $0, %eax
        call    printf
.L7:
        movl    $0, %edi
        call    exit
.L6:
        movl    cnt(%rip), %esi
        movl    $.LC2, %edi
        movl    $0, %eax
        call    printf
        jmp     .L7
        .cfi_endproc
.LFE19:
        .size   main, .-main
        .globl  cnt
        .bss
        .align 4
        .type   cnt, @object
        .size   cnt, 4
cnt:
        .zero   4
        .ident  "GCC: (GNU) 6.3.0"
        .section        .note.GNU-stack,"",@progbits

从而证实了书中的错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这个只有一个操作数的 x86-64 addq 指令是什么意思? (摘自CSAPP书籍第三版) 的相关文章

随机推荐

  • Google Chrome 扩展 + 使用 Facebook 登录 + Parse

    我正在尝试构建一个 google chrome 扩展 一个用例要求用户可以使用 Facebook 登录并通过帖子分享到他们的 Facebook 墙上 正确的申请流程是这样的 用户点击 google chrome 扩展 召唤扩展页面 用户在扩
  • JSF 中有类似 ServletContextListener 的东西吗?

    我想听一下 JSF 应用程序是否启动或停止 就像使用ServletContextListener在普通 Servlet Web 应用程序中 我怎样才能实现这个目标 您可以使用 ApplicationScoped http docs orac
  • SSIS排除Foreach循环容器中的某些文件

    我有一个 SSIS 包 它从特定目录加载 csv 文件 使用表达式和通配符来获取所有文件 目前 FileSpec容器的查找所有具有以下格式的文件 文件名 环境 这工作正常 现在从同一目录加载第二组文件 为了区分这些文件 文件格式为 文件名
  • Doctrine 的实体管理器崩溃并停止运行

    因此 当我在 ZF Doctrine 应用程序上运行测试时 某些测试碰巧破坏了 Doctrine 实体管理器 并且所有顺序测试由于 EM 关闭而失败 我在 test bootstrap php 中设置了 EM application new
  • Webpack 未加载背景图像

    我正在尝试加载图像 background transparent url img select icon png no repeat center right 8px 在我的 style scss 中它不起作用 这是我的 webpack c
  • 合并单独几何图层的图例

    我正在地图上绘制来自两个单独图层的点数据 并希望在一个图例中显示两个图层的信息 下面是一些代码来说明问题 set seed 42 lat1 lt rnorm 10 54 12 long1 lt rnorm 10 44 12 val1 lt
  • iOS - UILabel 或 UITextView 中的动画文本大小变化?

    在显示文本块的应用程序中 当设备转向横向时 我的字体大小会增加 我不喜欢它如何执行整个动画 然后突然跳到新的尺寸 所以我想在旋转过程中为尺寸变化设置动画 我在某处读到 将这个更改放入UIView动画块不起作用 因为字体属性不可设置动画 那么
  • 谷歌分析数据库[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有人知道 Google Analytics 中的数据是如何组织的吗 很难从大量数据中进行选择 它们执行
  • Laravel Http Facade 中的 PHP Curl 代理选项

    我正在使用 Laravel 的 Http 外观来发出请求 例如 Http withHeaders user agent gt My User agent gt retry 3 500 gt get https example com gt
  • mysql_fetch_array 返回重复数据

    每次我运行 mysql fetch array 时都会返回一个带有重复值的数组e g Array 0 gt 1 row id gt 1 1 gt some text first field gt some text 2 gt some te
  • 将图例添加到 LineCollection 图中

    这是与中给出的答案相关的派生问题根据颜色图设置线条颜色 https stackoverflow com questions 19868548 set line colors according to colormap其中建议了一个很好的解决
  • ASP.NET MVC:路由层次结构 URL

    我该如何为此制定路由 URL 类别 主 子 or 类别 主 sub1 subsub 我希望有 主 子 and 主 子1 子子 作为 CategoryController 的 Index 操作方法中的参数 找到了答案 应在路由路径中使用 ca
  • 使用 Node 'pg' 库连接到 Amazon Redshift

    我尝试使用 pg 库将我的 API 连接到 Redshift 实例 但出现以下错误 Possibly unhandled error SET TIME ZONE is not supported at Connection parseE U
  • Http 304 和缓存控制:无缓存

    我看到对网络服务器的一些调用的以下响应 初始调用 HTTP 1 1 200 OK Date Mon 16 Jan 2012 05 46 49 GMT X Powered By Servlet 2 5 JSP 2 1 Content Type
  • 向 D3 和弦图添加标签

    我是一名菜鸟程序员 所以这对于你们大多数人来说可能是一个简单的任务 此和弦图的标签和 或鼠标悬停文本需要哪些代码行 http mbostock github com d3 ex chord html http mbostock github
  • 在 azure 搜索中索引字典属性

    我有一个具有 type 属性的 DTODictionary
  • TextInputLayout 错误状态下的提示颜色

    根据 Google 的材料指南 https material io guidelines components text fields html text fields layout https material io guidelines
  • 拖动列时显示列标题

    我在中实现代码可分组标题 http www java2s com Code Java Swing Components GroupableGroupHeaderExample htm并尝试启用允许的重新排序 但我有两个问题 1 拖动列时 标
  • 使用自定义插值内核的 MATLAB imresize

    如何使用我的函数作为 MATLAB 中 imresize 函数的插值方法 我阅读了MATLAB关于如何使用自定义函数进行插值方法的帮助 但没有任何明确的示例 我试着为妈妈写一段代码 The imresize命令将默认使用bicubic方法
  • 这个只有一个操作数的 x86-64 addq 指令是什么意思? (摘自CSAPP书籍第三版)

    在下面的说明中 addq 是如何工作的 它只有一个操作数 书上声称它递增 rdx 但 rdx 不在这条指令中 我感到很困惑 这是来自 计算机系统 程序员的视角 一书 第三版 正如 Jester 在评论中指出的那样 这确实是一个错误 我实际上