我对x86寄存器的理解表明,每个寄存器都可以被整个32位代码访问,并且它被分成多个可访问的寄存器.
在这个例子中EAX是一个32位寄存器,如果我们调用AX它应该返回前16位,如果我们调用它AH或AL它应该返回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真正具有什么价值呢?
此循环在英特尔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 …
例如,累加器被命名EAX,并且在调用指令指针时IP.我也知道有些字节叫做CL和DH.我知道所有名字都必须有一个约定,但它是什么?
您好我需要一些帮助来了解这个汇编代码中发生了什么:
.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) 当我在汇编中进行编程并进行某种字符串操作时,我会使用al,ah有时候其他人也会使用字符,因为这样可以让我在寄存器中保留更多数据.我认为这是一个非常方便的功能,但英特尔的工程师似乎不同意我,因为他们没有使寄存器的两个高位字节可访问(或者我错了?).我不明白为什么.我想了一会儿,我的猜测是:
我想到了第二,因为我从未见过使用过的编译程序(al或使用gcc)bh或者其中任何一个.
为什么没有特定的寄存器来访问寄存器的其他部分(16-32)?
像啊或al一样访问ax寄存器的8位部分.

我正在研究 8086/8080 微处理器。其中使用的寄存器有名称,
当寄存器被命名为 R8、R9... 到 R15 时,继续直到 R8。我想知道
我们是否也将寄存器 RAX、RBX 等称为 R1、R2 等?
我开始学习汇编程序,这对我来说并不合乎逻辑.
为什么我不能在寄存器中使用多个更高的字节?
我理解rax- > eax- > 的历史原因ax,所以让我们关注新的 64位寄存器.例如,我可以使用r8和r8d,但为什么不r8dl和r8dh?同样适用于r8w和r8b.
我最初的想法是,我可以使用8个r8b在同一时间寄存器(就像我可以做的al,并ah在同一时间).但我不能.并且使用r8b使完整的r8寄存器"忙".
这提出了一个问题 - 为什么?如果您不能同时使用其他部件,为什么还只需要使用寄存器的一部分?为什么不保持只r8忘记下部?
我试着理解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) 我开始在 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) 哪里可以找到80x86注册的全名?我知道EAX意味着扩展AX.
那么,AX的含义是什么?即AX是首字母缩略词?
通过以下指令表手册阅读,我发现整数乘法通常要快得多8-bit registers.
在普通桌面CPU的上下文中,8-bit register意味着什么?存储在32位寄存器中的值是否恰好在8位范围内?没有实际的8位寄存器,对吗?