在 NASM (2.14.02) 中,指令add rbx, 0xffffffff导致
警告:有符号双字值超出界限 [-w+number-overflow]
我知道 64 位模式下的算术逻辑运算仅接受 32 位常量,但 0xffffffff 仍然是 32 位宽。
为什么 NASM 发出警告,为什么它假设一个有符号常量?它是否将 32 位符号扩展-1为 64 位-1(0xffffffffffffffff)并因此出现溢出?0x7fffffff 工作时不会发出警告。
我能以某种方式说服 NASM 这不是一个有符号常量,而是一个无符号常量吗?
这是什么意思:我只有 12 位的立即数,所以我可以只表示从 0 到 2^12 = 4096 的立即数吗?操作数 2 ,如果它是一个寄存器,可以有 32 位,但为什么立即常量只有 12 位?这个数字从何而来?
assembly arm instruction-set cpu-architecture immediate-operand
本页代码部分的第二条指令:
看起来像这样:MOV r9d, 0。编码如下:41 B9 00 00 00 00
唯一的问题是... Intel x64 手册中没有任何MOV指令可以获取 4 字节立即数并将其放入 64 位寄存器中。
这些是英特尔手册中的说明:
B0+ rb MOV r8, imm8 Move imm8 to r8.
REX + B0+ rb MOV r8***, imm8 Move imm8 to r8.
B8+ rw MOV r16, imm16 Move imm16 to r16.
B8+ rd MOV r32, imm32 Move imm32 to r32.
REX.W + B8+ rd MOV r64, imm64 OI Valid N.E. Move imm64 to r64.
Run Code Online (Sandbox Code Playgroud)
该指令似乎有效,但是如何呢?
假设 $t2= 0x55555550,然后执行以下指令:
andi $t2, $t2, -1
Run Code Online (Sandbox Code Playgroud)
$t2 变成 0x0005550
MIPS 仿真器1证实了这一点
然而,这不是我所期望的。我认为答案应该是 0x55555550 & 0xFFFFFFFF = 0x55555550。我认为常量 -1 在和逻辑之前被符号扩展为 0xFFFFFFFF。但似乎答案是 0x55555550 & 0x0000FFFF
为什么 -1 被符号扩展为 0x0000FFFF 而不是 0xFFFFFFFF
脚注 1:编者注:启用“扩展伪指令”的 MARS 确实将其扩展为多条指令以0xffffffff在 tmp 寄存器中生成,因此保持$t2不变。否则 MARS 和 SPIM 都会以不可编码的错误拒绝它。其他汇编程序可能有所不同。
assembly mips sign-extension zero-extension immediate-operand
我发现自己经常无法立即识别数字是十进制还是十六进制(如果十六进制数字没有前缀或字母)。例如,从上一个问题中得到一个喜欢0000000000400078但不确定是哪个的数字。
有没有办法在 x86_64 中明确指定带有前缀的十进制数?例如:
mov %rsp, %rbp
movb $0x16, -1(%rbp)
movb $0d22 -2(%rbp) # <-- something like this
movb $0b10110, -3(%rbp)
Run Code Online (Sandbox Code Playgroud)
我知道这样做movb $22, -2(%rbx)有效,但是有没有办法明确地为它加上前缀/后缀,以便我们知道它是小数?
因此,我正在使用 A64 指令集以汇编形式 ARM 进行编程。我正在使用指令 fmov d1, #31.0 将值移动到 dx 寄存器。但是,当我使用 0.0 或任何高于 31.0 的值时,它会显示错误:
"Error: invalid floating-point constant at operand 2 -- `fmov d1,#32.0'"
Run Code Online (Sandbox Code Playgroud)
那么,如何在 A64 上定义浮点常量?为什么我不能使用 31 以上的任何值或使用 0?如何以十六进制表示值?
另一个问题是:根据arm 的网站,它支持使用浮点寄存器作为 Bx、Hx、Sx、Dx 和 Qx(分别为 8、16、34、64 和 128 位),但我不能使用 Bx ,Hx 和 Qx 寄存器,显示:
“错误:操作数不匹配——`fmov b1,#1.0'”
“错误:所选处理器不支持`fmov h1,#2.0”
“错误:操作数不匹配——`fmov q1,#2.0'”
如何正确设置第二个操作数?
我正在尝试组装一些 64 位代码,但组装失败了:
addq $0xffffff7fc0005000, %rax
Run Code Online (Sandbox Code Playgroud)
有错误:
`add' 的错误操作数类型不匹配
第一个操作数是一个 64 位值,后者是一个应该组装好的寄存器。该指令前面有一个.code64伪操作。我正在组装
x86_64-elf-as test.s -o test.o --64
Run Code Online (Sandbox Code Playgroud)
至于汇编器本身,当用--version它调用时返回:
GNU assembler (GNU Binutils) 2.32
Copyright (C) 2019 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or later.
This program has absolutely no warranty.
This assembler was configured for a target of `x86_64-elf'.
Run Code Online (Sandbox Code Playgroud) assembly ×7
x86-64 ×4
arm ×1
arm64 ×1
att ×1
instructions ×1
machine-code ×1
mips ×1
nasm ×1
neon ×1