为什么他们说NASM中的字符串最多包含8个字符?

时间:2017-07-11 19:43:57

标签: assembly x86 nasm

NASM manual说:

  

3.4.2字符串

     

一个字符串最多包含八个字符   单引号(' ...'),双引号(" ...")或反引号   (`...   `)。单引号或双引号相当于NASM(除了   当然,用单引号围绕常量允许加倍   报价出现在其中,反之亦然);那些内容是   逐字表示。封闭在反引号中的字符串支持C风格   \ -escapes表示特殊字符。

我不明白为什么他们说一个字符串最多由八个字符组成,这是否意味着如果一个字符串由9个字符组成,它不会被称为字符串?!

1 个答案:

答案 0 :(得分:5)

一切都源于此

sub al, '0'

能够立即使用字符来极大地提高代码的可读性。

由此,连续的步骤立即 1

sub al, '0'
sub ax, '00'
sub eax, '0000' 
sub rax, '00000000'

NASM在界定字符中并不是很挑剔,因为文档澄清了(我使用字符串的单引号和字符串的双引号但它只是我的个人品味)。

请注意,字符串会生成一个数字立即数,其中最左边的字符放在最不重要的字节中 mov rbx, '01234567'对应mov rbx,0x3736353433323130,其基本原理是当该值存储在内存中时,会获得键入的确切字符串。

另外,请注意,它是指示字符串和字符串分开的上下文:

  

字符常量由最多八个字节长的字符串组成,用于表达式上下文。它被视为整数。

 MY_SYMBOL EQU 'abcd'          ;Character string
 MY_VAR    dw  'abcd'          ;String

 mov eax, MY_SYMBOL            ;mov eax, 64636261h
 mov eax, MY_VAR               ;mov eax, address_of(MY_VAR)
 mov eax, 'cdef'*2             ;Character string

因为它们在语法上重叠。

1 没有双关语