相关疑难解决方法(0)

为什么32位寄存器上的x86-64指令归零整个64位寄存器的上半部分?

x86-64 Tour of Intel Manuals中,我读到了

也许最令人惊讶的事实是,诸如MOV EAX, EBX自动将指令的高32位归零的指令RAX.

同一来源引用的英特尔文档(3.4.1.1 64位手动基本架构中的通用寄存器)告诉我们:

  • 64位操作数在目标通用寄存器中生成64位结果.
  • 32位操作数生成32位结果,在目标通用寄存器中零扩展为64位结果.
  • 8位和16位操作数生成8位或16位结果.目标通用寄存器的高56位或48位(分别)不会被操作修改.如果8位或16位操作的结果用于64位地址计算,则将寄存器显式符号扩展为完整的64位.

在x86-32和x86-64汇编中,16位指令如

mov ax, bx
Run Code Online (Sandbox Code Playgroud)

不要表现出这种"奇怪"的行为,即eax的上层词被归零.

因此:引入这种行为的原因是什么?乍一看似乎不合逻辑(但原因可能是我习惯了x86-32汇编的怪癖).

x86 assembly x86-64 cpu-registers zero-extension

97
推荐指数
3
解决办法
2万
查看次数

为什么没有包含更高字节EAX的寄存器?

%AX = (%AH + %AL)

那么为什么不%EAX = (%SOME_REGISTER + %AX)注册%SOME_REGISTER呢?

x86 assembly

65
推荐指数
3
解决办法
5万
查看次数

为什么会使用"movl $ 1,%eax"而不是"movb $ 1,%eax"

正如标题所述,为什么人们会使用"movl $ 1,%eax"而不是"movb $ 1,%eax",我被告知movl会将%eax的高阶位清零,但不是%eax一个相当于系统字大小的寄存器?意思是movl实际上是一个整数运算(而不是长整数?)

我显然对这一切感到困惑; 谢谢.

x86 assembly

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

为什么GCC不使用部分寄存器?

write(1,"hi",3)在linux上反汇编,gcc -s -nostdlib -nostartfiles -O3结果如下:

ba03000000     mov edx, 3 ; thanks for the correction jester!
bf01000000     mov edi, 1
31c0           xor eax, eax
e9d8ffffff     jmp loc.imp.write
Run Code Online (Sandbox Code Playgroud)

我不是到编译器的开发,但由于移动到这些寄存器的每一个值是恒定的和已知的编译时间,我很好奇,为什么不GCC使用dl,dilal来代替.也许有人会说,此功能不会让任何性能上的差异,但有一个在之间的可执行文件的大小有很大的区别mov $1, %rax => b801000000,并mov $1, %al => b001当我们谈论数千寄存器的程序访问.如果软件的优雅部分不仅体积小,它确实会对性能产生影响.

有人可以解释为什么"海湾合作委员会决定"它无所谓?

x86 assembly gcc x86-64

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

英特尔32位和64位寄存器的名称中E和R前缀代表什么?

32位寄存器名称以E开头,64位寄存器以R开头.E和R代表什么?是否有理由选择这些字母?

此外,在64位寄存器中,我们也可以在任何低级调试器(如Windbg)中看到,最右边的位仍然用与64位寄存器相同的名称引用,除了名称以E.例如,64位系统中RAX寄存器的最右边32位称为EAX.

那么,E和R代表什么?而且,为什么后缀X用于注册?

64-bit x86 assembly x86-64 cpu-registers

13
推荐指数
1
解决办法
3294
查看次数

汇编寄存器采用64位架构

关于汇编寄存器的大小答案:

  • 首先,什么尺寸eax,ax,ah和同行,在64位架构?如何访问单个寄存器的字节以及如何访问所有64位寄存器的8个字节?

    我非常喜欢x86-64(x64)Itanium处理器.

  • 第二,在新的调用约定中,使用四个寄存器来保存函数调用中前四个参数的正确方法是什么?

assembly x86-64 itanium cpu-registers 32bit-64bit

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

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

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

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

在此输入图像描述

x86 assembly

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

如何在emu 8086中用汇编语言打印0到100?

在这里,我尝试了一些方法来打印 10 到 0 的十进制数字emu8086

     .MODEL SMALL
     .STACK 100H
     .DATA
        NUM DB 58D

     .CODE
     MAIN PROC
          MOV AX,@DATA
          MOV DS,AX


     START:
         CMP NUM,48D 
         JGE PRINT
         JMP END_


     PRINT:
         MOV AH,2
         MOV DL,NUM
         INT 21H
         DEC NUM
         JMP START

     END_:
         MOV AH,4CH
         MAIN ENDP
     END MAIN
Run Code Online (Sandbox Code Playgroud)

它在打印 9 到 0 时工作得很好,但它不是打印 10 而是打印asciivalue 的字符10d。我是 .so 的新手,assembly language如何打印 0 到 100 个十进制数字?

assembly emu8086

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

在汇编程序中交换最重要的字节和最低有效字节

假设我们在EAX寄存器中保存数字1,并将最高有效字节与最低有效字节交换.新交换的数字是256还是16777216?

我在汇编程序中通过交换AL-的值和AH-Register的值来尝试它.我的结果是256.我不认为这是正确的,我也不理解256的结果.我认为EAX寄存器是32位,而不是16位.

该问题与交换的正确结果有关.

x86 assembly byte cpu-registers

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

阐明32位寄存器x86的小节

我对x86汇编中的32位寄存器的子部分有疑问:是否将寄存器(使用时)的下部子部分视作相应的32位寄存器的一部分?

ror cl,2    
ror cl,2
推ecx
流行曲

以上面的代码部分为例-由于CLECX寄存器的子部分,当我将寄存器的内容压入堆栈时,子部分中的内容也被CL压入堆栈了吗?还是分开对待?

并假设如果我然后将堆栈弹出到EAX寄存器中,那么进入CL寄存器之前,寄存器中的内容是什么EAX

x86 assembly stack cpu-registers

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