我有一个赋值,要求定义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] ;
即使我可以安全地将这些值存储到寄存器中以便将来用于添加,我也很好奇.我应该使用符号扩展来获得较短的值,但可以使用某个方向
3.4.1 NASM在线手册中的数字常量(首次google命中: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
.所有其他形式从内存加载与操作数大小相同的大小,因此没有任何标记扩展.(ALU操作add
具有单独的操作码add r32, imm32
和add r32, imm8
(带符号扩展),因为添加/ ANDing/ORing一个小常量非常常见.
如果要使用符号扩展名从内存加载,请movsx
在insn参考手册中查找.(从x86信息维基链接.)例如movsx rax, byte [mem]