我有一个赋值,要求定义4个整数,每个整数都有不同的字节长度(1,2,4,8)
这段代码会起作用吗?
segment .data
one db 1
two dw 01
four dd 1011
eight dq 01101110
global _start
_start:
mov rax, [one] ;
mov rbx, [two] ;
如果我可以安全地将这些值存储到寄存器中以便将来用于添加,我也很好奇。
我应该使用符号扩展名来表示较短的值,但可以使用某个方向
答案 0 :(得分:9)
3.4.1 Numeric Constants(首次谷歌搜索:nasm二进制常量):
一些例子(都产生完全相同的代码):
mov ax,200 ; decimal
mov ax,0200 ; still decimal
mov ax,0200d ; explicitly decimal
mov ax,0d200 ; also decimal
mov ax,0c8h ; hex
mov ax,$0c8 ; hex again: the 0 is required
mov ax,0xc8 ; hex yet again
mov ax,0hc8 ; still hex
mov ax,310q ; octal
mov ax,310o ; octal again
mov ax,0o310 ; octal yet again
mov ax,0q310 ; octal yet again
mov ax,11001000b ; binary
mov ax,1100_1000b ; same binary constant
mov ax,1100_1000y ; same binary constant once more
mov ax,0b1100_1000 ; same binary constant yet again
mov ax,0y1100_1000 ; same binary constant yet again
显然,您可以在任何地方的常量上使用这些后缀,而不仅仅是立即操作数。
是的,您可以使用二进制文件。 请注意,问题中的代码使用了一个位常量,而不是一个字节常量,用于存储在one
中的值。 one = 1
和two = 2
,但four = 2^3 + 0 + 2^1 + 1 = 11(decimal)
。
eight
同样奇怪的定义。它应该是eight = 1000b
。
所有2的幂整数只在其二进制表示中设置了一个位,就像所有10次幂的数字在其十进制表示中都有一个1
一样。
执行任何符号扩展的mov
指令的唯一形式是mov r64, imm32
。所有其他形式从内存加载与操作数大小相同的大小,因此没有任何标记扩展。 (像add
这样的ALU操作具有add r32, imm32
和add r32, imm8
(带符号扩展名)的单独操作码,因为添加/ ANDing / ORing一个小常量非常常见。
如果要使用符号扩展名从内存加载,请在insn参考手册中查找movsx
。 (从x86信息维基链接。)例如movsx rax, byte [mem]