问题标签 [zero-extension]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
25221 浏览

assembly - 对有符号/无符号加载和存储指令 (MIPS) 的说明

我似乎无法掌握这些东西的概念,即使有谷歌的帮助和我手中的教科书。

遵循格式(操作码、rs、rt、偏移量)...

  • 您是否在将偏移量添加到地址值之前签署扩展偏移量?还是在扩展之前添加?
  • lblbu的情况下,有什么区别?它是否也遵循 MIPS 算术定义,即“无符号”只是意味着它不会报告溢出?
  • 为什么lw没有未签名的版本?连店里的说明书都没有……
0 投票
1 回答
6147 浏览

assembly - movzwl、%ax 和负值的奇怪结果

好的,所以我正在处理以下代码片段:

因此,在处理正值时,它的行为符合预期。复制到 %edx 的值是 %eax(或 %ax)的尾随 16 位。

然而,如果你输入一个负数,一切都会变得很奇怪,而且它的行为似乎不像预期的那样。

例如,如果 %eax 的值为 -67043552,则复制到 %edx 的值为 65312。

我对组装很陌生,如果这对我来说是一个明显的误解,我很抱歉。任何帮助将不胜感激。

0 投票
2 回答
78588 浏览

assembly - MOVZBL 指令在 IA-32 AT&T 语法中的作用是什么?

这条指令具体是做什么的?

0 投票
4 回答
37207 浏览

assembly - 为什么 32 位寄存器上的 x86-64 指令会将完整 64 位寄存器的上部归零?

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

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

同一来源引用的英特尔文档(3.4.1.1 General-Purpose Registers in 64-Bit Mode in manual Basic Architecture)告诉我们:

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

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

不要表现出这种eax的高位字归零的“奇怪”行为。

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

0 投票
1 回答
3019 浏览

assembly - 是否可以始终使用“mov eax, 0x1”代替“mov rax, 0x1”?

组装此代码时nasm

我得到这个输出:

这是mov eax, 0x1重复两次的操作码。

这是否意味着总是mov rax, 0x1可以被替换,或者只是在这种情况下?mov eax, 0x1

如果这是正确的,那么使用它会比:

因为组装后变成 6 个字节,而mov eax, 0x1只有 5 个字节?

0 投票
0 回答
64 浏览

x86 - 32位是否会将64位寄存器中的高位移出零?

可能重复:
为什么大多数 x64 指令将 32 寄存器的上部归零

如果我执行movl something, %eaxrax包含类似 0x1234567812345678 的内容,它会自动将上半部分归零rax吗?

0 投票
1 回答
65177 浏览

assembly - x86_64 寄存器 rax/eax/ax/al 覆盖完整的寄存器内容

正如广泛宣传的那样,现代 x86_64 处理器具有 64 位寄存器,可以向后兼容的方式用作 32 位寄存器、16 位寄存器甚至 8 位寄存器,例如:

这种方案可以从字面上理解,即人们总是可以使用指定的名称来访问寄存器的一部分,用于读取或写入目的,这将是高度合乎逻辑的。事实上,对于 32 位以下的所有内容都是如此:

然而,一旦我们进入 64 位的东西,事情似乎就相当尴尬了:

这种行为对我来说似乎非常荒谬和不合逻辑。看起来试图以eax任何方式写入任何内容都会导致擦除rax寄存器的高 32 位。

所以,我有两个问题:

  1. 我相信这种尴尬的行为必须记录在某个地方,但我似乎无法在任何地方找到详细的解释(关于如何擦除 64 位寄存器的高 32 位)。我写的eax总是擦拭是对rax的,还是更复杂的东西?它适用于所有 64 位寄存器,还是有一些例外?

    一个高度相关的问题提到了相同的行为,但是,遗憾的是,再次没有对文档的确切引用。

    换句话说,我想要一个指向指定此行为的文档的链接。

  2. 只是我还是整个事情看起来真的很奇怪和不合逻辑(即 eax-ax-ah-al、rax-ax-ah-al 有一种行为,而 rax-eax 有另一种行为)?可能是我在这里遗漏了一些关于为什么要这样实施的关键点?

    对“为什么”的解释将不胜感激。

0 投票
2 回答
6586 浏览

assembly - 在 MIPS 中,何时使用有符号扩展,何时使用零扩展?

我正在设计一个 MIPS 处理器作为我的个人项目,现在我遇到了一个非常困惑的问题。我只是无法总结在 MIPS 中何时使用有符号扩展以及何时使用零扩展。

我搜索了很多资源,主要是说:

1) ADDI、ADDIU 都使用有符号扩展。
2) ANDI、ORI、XORI 都使用零扩展。

但是,在这两条指令中,我开始感到困惑:

SLTIU/SLTI

在 Imagination 的“MIPS 程序员架构卷 II-A:MIPS 指令集手册”第 368 页中说: 图片1

它清楚地提到了 16 位立即数是有符号扩展的。但我不明白以下语句:

[0, 32767] 或最大 [max_unsigned-32767, max_unsigned] 无符号范围的结尾。

还有一些人说 16 位立即数是零扩展的,如下所示:

http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Mips/pseudojump.html

那么,有人能解释一下 MIPS 中的有符号指令和无符号指令之间到底有什么区别吗?

0 投票
4 回答
6982 浏览

assembly - MASM 程序集将 8 位寄存器移动到 16 位寄存器(即 mov cx, ch)

我决定学习一门汇编编程语言。我正在使用这个 8086 教程。在底部的练习是找出一些指令中的错误,其中之一是

我在这个主题上发现了一些类似的问题,解释了如何实现它,但现在我想知道为什么禁止这个操作?

假设我在 CH 中有 10d = 00001010b 并希望将其放入 CL 并同时擦除 CH。mov cx, ch似乎这样做是因为它将 10d 显示为 16bit 00000000 00001010 并将其分别放入 CH 和 CL(整个 CX)

它有什么问题,为什么给定的教程要求在这个表达式中查找错误?

0 投票
1 回答
80 浏览

c++ - 将汇编指令翻译成 c++

我在将以下程序集翻译成 c++ 时遇到问题

其中 EDX 是一个 32 位寄存器。我需要获得最低的 16 位(DX)。

我尝试了以下方法:

我希望得到存储在 dx 中的 BCDE 的值,但它有点错误。

任何帮助将非常感激。