相关疑难解决方法(0)

AX,AH,AL如何映射到EAX?

我对x86寄存器的理解表明,每个寄存器都可以被整个32位代码访问,并且它被分成多个可访问的寄存器.

在这个例子中EAX是一个32位寄存器,如果我们调用AX它应该返回前16位,如果我们调用它AHAL它应该返回16位之后的下一个8位并且AL应该返回最后8位.

所以我的问题,因为我不相信这是它的运作方式.如果我们存储一个32位值的七...也就是EAX存储

0000 0100 0000 1000 0110 0000 0000 0111
Run Code Online (Sandbox Code Playgroud)

因此,如果我们访问AX它应该返回

0000 0100 0000 1000
Run Code Online (Sandbox Code Playgroud)

如果我们读AH它应该返回

0000 0100
Run Code Online (Sandbox Code Playgroud)

当我们读到AL它时应该返回

0000 0111
Run Code Online (Sandbox Code Playgroud)

它是否正确?如果它AH真正具有什么价值呢?

x86 assembly cpu-registers

36
推荐指数
4
解决办法
9万
查看次数

Haswell/Skylake的部分寄存器究竟如何表现?写AL似乎对RAX有假依赖,而AH是不一致的

此循环在英特尔Conroe/Merom上每3个周期运行一次,imul按预期方式在吞吐量方面存在瓶颈.但是在Haswell/Skylake上,它每11个循环运行一次,显然是因为setnz al它依赖于最后一个循环imul.

; synthetic micro-benchmark to test partial-register renaming
    mov     ecx, 1000000000
.loop:                 ; do{
    imul    eax, eax     ; a dep chain with high latency but also high throughput
    imul    eax, eax
    imul    eax, eax

    dec     ecx          ; set ZF, independent of old ZF.  (Use sub ecx,1 on Silvermont/KNL or P4)
    setnz   al           ; ****** Does this depend on RAX as well as ZF?
    movzx   eax, al
    jnz  .loop         ; }while(ecx);
Run Code Online (Sandbox Code Playgroud)

如果setnz al …

x86 assembly intel cpu-architecture micro-optimization

30
推荐指数
2
解决办法
1537
查看次数

为什么x86寄存器的命名方式如何?

例如,累加器被命名EAX,并且在调用指令指针时IP.我也知道有些字节叫做CLDH.我知道所有名字都必须有一个约定,但它是什么?

x86 assembly history naming

23
推荐指数
5
解决办法
3882
查看次数

不知道为什么我们在汇编代码使用%eax和%edx时添加寄存器%rdx和%rax

您好我需要一些帮助来了解这个汇编代码中发生了什么:

        .file   "mystery.c"

        .text

        .globl mystery

              .type mystery, @function

 mystery:
   pushq    %rbp
    movq    %rsp, %rbp

   movl %edi, -20(%rbp)
   movl $1, -16(%rbp)
   movl $0, -12(%rbp)
   movl $0, -8(%rbp)
   cmpl $2, -20(%rbp)
   jg   .L2
   movl $1, %eax
   jmp  .L3

  .L2:
movl    $2, -4(%rbp)
jmp .L4

  .L5:
movl    -12(%rbp), %eax
movl    -16(%rbp), %edx
leal    (%rdx,%rax), %eax
movl    %eax, -8(%rbp)
movl    -16(%rbp), %eax
movl    %eax, -12(%rbp)
movl    -8(%rbp), %eax
movl    %eax, -16(%rbp)
addl    $1, -4(%rbp)

.L4:
movl    -4(%rbp), %eax
cmpl    -20(%rbp), %eax
jle .L5 …
Run Code Online (Sandbox Code Playgroud)

x86 assembly

12
推荐指数
2
解决办法
1万
查看次数

为什么英特尔没有提供其CPU寄存器的高阶部分?

当我在汇编中进行编程并进行某种字符串操作时,我会使用al,ah有时候其他人也会使用字符,因为这样可以让我在寄存器中保留更多数据.我认为这是一个非常方便的功能,但英特尔的工程师似乎不同意我,因为他们没有使寄存器的两个高位字节可访问(或者我错了?).我不明白为什么.我想了一会儿,我的猜测是:

  1. 它们会使CPU太复杂
  2. 他们没用
  3. 也许两者都是上面的

我想到了第二,因为我从未见过使用过的编译程序(al或使用gcc)bh或者其中任何一个.

x86 assembly cpu-registers

6
推荐指数
3
解决办法
590
查看次数

为什么EAX中的高16位不能按名称访问(如AX,AH和AL)?

为什么没有特定的寄存器来访问寄存器的其他部分(16-32)?

al一样访问ax寄存器的8位部分.

在此输入图像描述

x86 assembly

6
推荐指数
2
解决办法
717
查看次数

我们是否也将寄存器 RAX、RBX 等称为 R1、R2 等?

我正在研究 8086/8080 微处理器。其中使用的寄存器有名称,

  1. 雷克斯
  2. RBX
  3. RCX
  4. RDX

当寄存器被命名为 R8、R9... 到 R15 时,继续直到 R8。我想知道

我们是否也将寄存器 RAX、RBX 等称为 R1、R2 等?

x86 x86-64 cpu-registers microprocessors

5
推荐指数
2
解决办法
2311
查看次数

为什么我可以在寄存器中访问较低的双字/字/字节但不能更高?

我开始学习汇编程序,这对我来说并不合乎逻辑.

为什么我不能在寄存器中使用多个更高的字节?

我理解rax- > eax- > 的历史原因ax,所以让我们关注新的 64位寄存器.例如,我可以使用r8r8d,但为什么不r8dlr8dh?同样适用于r8wr8b.

我最初的想法是,我可以使用8个r8b在同一时间寄存器(就像我可以做的al,并ah在同一时间).但我不能.并且使用r8b使完整的r8寄存器"忙".

这提出了一个问题 - 为什么?如果您不能同时使用其他部件,为什么还只需要使用寄存器的一部分?为什么不保持只r8忘记下部?

64-bit x86 assembly x86-64 cpu-registers

5
推荐指数
1
解决办法
2664
查看次数

英特尔x86汇编语法中的寄存器括号

我试着理解x86汇编中的括号.在这个例子中,寄存器ax应该包含X,因为括号代表当前的地址LABEL.

mov ax, [LABEL]

LABEL:
db "X", 0
Run Code Online (Sandbox Code Playgroud)

但我不明白以下两条装配线:

mov al, [ebx]
Run Code Online (Sandbox Code Playgroud)

为什么我需要括号?是因为ebx是32位寄存器还是ax16位?区别在于:

mov al, ebx
Run Code Online (Sandbox Code Playgroud)

或者这个,我不明白为什么我需要括号......

mov [edx], ax
Run Code Online (Sandbox Code Playgroud)

syntax x86 assembly nasm cpu-registers

3
推荐指数
1
解决办法
3050
查看次数

是否有不同 x86_64 操作和 C std lib 函数使用的寄存器列表?

我开始在 ubuntu linux 上使用 NASM 汇编器学习 x86_64 汇编编程。我遇到的问题之一是弄清楚操作神奇地使用了哪些寄存器。

我正在阅读的书有这样的代码示例:

mov    rdi, fmt1
mov    rsi, strng
mov    rax, 0
call   printf

; How am I supposed to know which registers are used by the call to printf? 
; The libc printf function supports an arbitrary number of parameters. 
; Clearly there aren't an unlimited number of registers in x86_64 so how does this work
; as the parameter list grows?
Run Code Online (Sandbox Code Playgroud)

代码示例的另一部分是这样的:

xor    rax, rax
mov    rbx, strng
mov    rcx, strLen
mov …
Run Code Online (Sandbox Code Playgroud)

assembly x86-64 nasm calling-convention

3
推荐指数
1
解决办法
452
查看次数

我在哪里可以找到x86寄存器名称?

哪里可以找到80x86注册的全名?我知道EAX意味着扩展AX.

那么,AX的含义是什么?即AX是首字母缩略词?

x86 assembly naming cpu-registers

2
推荐指数
2
解决办法
9118
查看次数

什么是桌面CPU上的8位寄存器?

通过以下指令表手册阅读,我发现整数乘法通常要快得多8-bit registers.

在普通桌面CPU的上下文中,8-bit register意味着什么?存储在32位寄存器中的值是否恰好在8位范围内?没有实际的8位寄存器,对吗?

cpu optimization x86 cpu-registers 8-bit

2
推荐指数
1
解决办法
1698
查看次数