gpt4 book ai didi

assembly - cmpq指令的作用是什么?

转载 作者:行者123 更新时间:2023-12-02 14:50:59 25 4
gpt4 key购买 nike

我正在阅读以下系统调用的定义:

.text
.globl syscall
.type syscall,%function
.align 16
syscall:
movq %rdi, %rax /* Syscall number -> rax. */
movq %rsi, %rdi /* shift arg1 - arg5. */
movq %rdx, %rsi
movq %rcx, %rdx
movq %r8, %r10
movq %r9, %r8
movq 8(%rsp),%r9 /* arg6 is on the stack. */
syscall /* Do the system call. */
cmpq $-4095, %rax /* Check %rax for error. */
jae __syscall_error /* Branch forward if it failed. */
ret /* Return to caller. */

.size syscall,.-syscall

我看到它解释了 cmpq $-4095 %rax 行确定 %rax 是否包含 -1 到 -4095 之间的值。它是如何做到的? cmpq指令到底有什么作用?

最佳答案

cmpq $-4095, %rax将 64 位寄存器 %rax 与立即值 -4095 进行比较- 为了比较的目的,该值被符号扩展为 64 位。即-4095具有 64 位 2 的补码表示形式:ffff ffff ffff f001

cmp指令设置标志寄存器,就像 sub 一样。从第一个操作数(减去)第二个操作数 - 在 AT&T 语法中“第二个”和“第一个”颠倒过来。实际上,标志是根据以下结果设置的:(RAX - (- 4095))(RAX + 4095) ,与2的补码相同。

设置的标志之一是进位标志(CF),它在(无符号)溢出时设置。 jae指令(如果高于或等于则跳转)实际上是 jnc 的“别名” (如果不进位则跳转)。换句话说,如果 (RAX + 4095) 则采用该分支。 携带。在 2 的补码中,对于 RAX 的值来说也是如此。范围:[-4095, -1] 。 (记住 2 的补码算术如何换行)。

<小时/>

说明,包括cmpjae (或 j<cond> )描述于: Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 2 .

[E]FLAGS 寄存器(以及算术标志表示的内容)在 Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1 的第 3.4.3 节中进行了描述。 .

关于assembly - cmpq指令的作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21440403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com