【问题标题】:Why they say a character string consists of up to eight characters in NASM?为什么他们说一个字符串在 NASM 中最多包含八个字符?
【发布时间】:2017-07-11 19:43:56
【问题描述】:

NASM manual 说:

3.4.2 字符串

一个字符串最多包含八个字符 单引号 ('...')、双引号 ("...") 或反引号 (`... `)。单引号或双引号等价于 NASM(除了 当然,用单引号包围常量允许双 引号出现在其中,反之亦然);那些内容是 逐字表示。用反引号括起来的字符串支持 C 风格 \–特殊字符的转义。

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

【问题讨论】:

  • 是的,您只需要再阅读 2 个小节,3.4.4 String Constants 上面写着 “字符串常量看起来像字符常量,只是更长”

标签: assembly x86 nasm


【解决方案1】:

一切都源于此

sub al, '0'

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

从那以后连续的步骤是立即的1

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

NASM 在分隔字符方面并不是很挑剔,正如文档所阐明的那样(我对字符使用单引号,对字符串使用双引号,但这只是我个人的喜好)。

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

另外,请注意区分字符串和字符串的是上下文:

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

 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 没有双关语

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-16
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 2020-03-21
    • 1970-01-01
    相关资源
    最近更新 更多