我可以使用二进制在汇编中写入整数常量吗?

时间:2015-12-03 03:15:02

标签: assembly binary x86 nasm

我有一个赋值,要求定义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]    ;
如果我可以安全地将这些值存储到寄存器中以便将来用于添加,我也很好奇。 我应该使用符号扩展名来表示较短的值,但可以使用某个方向

1 个答案:

答案 0 :(得分:9)

NASM在线手册中的

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 = 1two = 2,但four = 2^3 + 0 + 2^1 + 1 = 11(decimal)

eight同样奇怪的定义。它应该是eight = 1000b

所有2的幂整数只在其二进制表示中设置了一个位,就像所有10次幂的数字在其十进制表示中都有一个1一样。

执行任何符号扩展的mov指令的唯一形式是mov r64, imm32。所有其他形式从内存加载与操作数大小相同的大小,因此没有任何标记扩展。 (像add这样的ALU操作具有add r32, imm32add r32, imm8(带符号扩展名)的单独操作码,因为添加/ ANDing / ORing一个小常量非常常见。

如果要使用符号扩展名从内存加载,请在insn参考手册中查找movsx。 (从信息维基链接。)例如movsx rax, byte [mem]