问题标签 [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.
assembly - 对有符号/无符号加载和存储指令 (MIPS) 的说明
我似乎无法掌握这些东西的概念,即使有谷歌的帮助和我手中的教科书。
遵循格式(操作码、rs、rt、偏移量)...
- 您是否在将偏移量添加到地址值之前签署扩展偏移量?还是在扩展之前添加?
- 在lb和lbu的情况下,有什么区别?它是否也遵循 MIPS 算术定义,即“无符号”只是意味着它不会报告溢出?
- 为什么lw没有未签名的版本?连店里的说明书都没有……
assembly - movzwl、%ax 和负值的奇怪结果
好的,所以我正在处理以下代码片段:
因此,在处理正值时,它的行为符合预期。复制到 %edx 的值是 %eax(或 %ax)的尾随 16 位。
然而,如果你输入一个负数,一切都会变得很奇怪,而且它的行为似乎不像预期的那样。
例如,如果 %eax 的值为 -67043552,则复制到 %edx 的值为 65312。
我对组装很陌生,如果这对我来说是一个明显的误解,我很抱歉。任何帮助将不胜感激。
assembly - MOVZBL 指令在 IA-32 AT&T 语法中的作用是什么?
这条指令具体是做什么的?
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 汇编的怪癖)。
assembly - 是否可以始终使用“mov eax, 0x1”代替“mov rax, 0x1”?
组装此代码时nasm
:
我得到这个输出:
这是mov eax, 0x1
重复两次的操作码。
这是否意味着总是mov rax, 0x1
可以被替换,或者只是在这种情况下?mov eax, 0x1
如果这是正确的,那么使用它会比:
因为组装后变成 6 个字节,而mov eax, 0x1
只有 5 个字节?
x86 - 32位是否会将64位寄存器中的高位移出零?
如果我执行movl something, %eax
并rax
包含类似 0x1234567812345678 的内容,它会自动将上半部分归零rax
吗?
assembly - x86_64 寄存器 rax/eax/ax/al 覆盖完整的寄存器内容
正如广泛宣传的那样,现代 x86_64 处理器具有 64 位寄存器,可以向后兼容的方式用作 32 位寄存器、16 位寄存器甚至 8 位寄存器,例如:
这种方案可以从字面上理解,即人们总是可以使用指定的名称来访问寄存器的一部分,用于读取或写入目的,这将是高度合乎逻辑的。事实上,对于 32 位以下的所有内容都是如此:
然而,一旦我们进入 64 位的东西,事情似乎就相当尴尬了:
这种行为对我来说似乎非常荒谬和不合逻辑。看起来试图以eax
任何方式写入任何内容都会导致擦除rax
寄存器的高 32 位。
所以,我有两个问题:
我相信这种尴尬的行为必须记录在某个地方,但我似乎无法在任何地方找到详细的解释(关于如何擦除 64 位寄存器的高 32 位)。我写的
eax
总是擦拭是对rax
的,还是更复杂的东西?它适用于所有 64 位寄存器,还是有一些例外?一个高度相关的问题提到了相同的行为,但是,遗憾的是,再次没有对文档的确切引用。
换句话说,我想要一个指向指定此行为的文档的链接。
只是我还是整个事情看起来真的很奇怪和不合逻辑(即 eax-ax-ah-al、rax-ax-ah-al 有一种行为,而 rax-eax 有另一种行为)?可能是我在这里遗漏了一些关于为什么要这样实施的关键点?
对“为什么”的解释将不胜感激。
assembly - 在 MIPS 中,何时使用有符号扩展,何时使用零扩展?
我正在设计一个 MIPS 处理器作为我的个人项目,现在我遇到了一个非常困惑的问题。我只是无法总结在 MIPS 中何时使用有符号扩展以及何时使用零扩展。
我搜索了很多资源,主要是说:
1) ADDI、ADDIU 都使用有符号扩展。
2) ANDI、ORI、XORI 都使用零扩展。
但是,在这两条指令中,我开始感到困惑:
SLTIU/SLTI
在 Imagination 的“MIPS 程序员架构卷 II-A:MIPS 指令集手册”第 368 页中说:
它清楚地提到了 16 位立即数是有符号扩展的。但我不明白以下语句:
[0, 32767] 或最大 [max_unsigned-32767, max_unsigned] 无符号范围的结尾。
还有一些人说 16 位立即数是零扩展的,如下所示:
那么,有人能解释一下 MIPS 中的有符号指令和无符号指令之间到底有什么区别吗?
assembly - MASM 程序集将 8 位寄存器移动到 16 位寄存器(即 mov cx, ch)
我决定学习一门汇编编程语言。我正在使用这个 8086 教程。在底部的练习是找出一些指令中的错误,其中之一是
我在这个主题上发现了一些类似的问题,解释了如何实现它,但现在我想知道为什么禁止这个操作?
假设我在 CH 中有 10d = 00001010b 并希望将其放入 CL 并同时擦除 CH。mov cx, ch
似乎这样做是因为它将 10d 显示为 16bit 00000000 00001010 并将其分别放入 CH 和 CL(整个 CX)
它有什么问题,为什么给定的教程要求在这个表达式中查找错误?
c++ - 将汇编指令翻译成 c++
我在将以下程序集翻译成 c++ 时遇到问题
其中 EDX 是一个 32 位寄存器。我需要获得最低的 16 位(DX)。
我尝试了以下方法:
我希望得到存储在 dx 中的 BCDE 的值,但它有点错误。
任何帮助将非常感激。