假设我想声明一个变量,比如“u”,它是一个字符,为什么我要用.byte而不是.ascii呢?单个ascii字符的长度不也是1个字节吗?
ikfrs5lh1#
对于单个ASCII字符,您可以选择.ascii "u"或.byte 'u'。两者都将在当前位置组装成一个字节。这是.ascii和.byte的功能几乎重叠的一个用例。对于人类读者来说,有些人可能会把.ascii读成char foo[1] = {'u'};,而.byte读成char bar = 'u';,但在asm中,这只是语义上的区别。两者都是1字节的对象,具有相同的对象表示,不像C,没有任何东西会隐式地解引用一个对象来获取值,而名称是数组的地址。.byte允许使用非ASCII值(如.byte 1, 2, 3)方便地实现Cuint8_t arr[] = {1,2,3};个如果你的汇编程序支持十六进制转义码(GAS或clang),你可以等效地编写.ascii "\x01\x02\x03",但是对于人类读者来说,.byte版本看起来更像C。.byte也允许像-2那样的有符号负值,而不必像.ascii "\xFE"那样手动计算出2的补码位模式。对于长度超过1个字节的文本字符串,.ascii "abc"当然比.byte 'a', 'b', 'c' .
.ascii "u"
.byte 'u'
.ascii
.byte
char foo[1] = {'u'};
char bar = 'u';
.byte 1, 2, 3
uint8_t arr[] = {1,2,3};
.ascii "\x01\x02\x03"
-2
.ascii "\xFE"
.ascii "abc"
.byte 'a', 'b', 'c'
1条答案
按热度按时间ikfrs5lh1#
对于单个ASCII字符,您可以选择
.ascii "u"
或.byte 'u'
。两者都将在当前位置组装成一个字节。这是.ascii
和.byte
的功能几乎重叠的一个用例。对于人类读者来说,有些人可能会把
.ascii
读成char foo[1] = {'u'};
,而.byte
读成char bar = 'u';
,但在asm中,这只是语义上的区别。两者都是1字节的对象,具有相同的对象表示,不像C,没有任何东西会隐式地解引用一个对象来获取值,而名称是数组的地址。.byte
允许使用非ASCII值(如.byte 1, 2, 3
)方便地实现Cuint8_t arr[] = {1,2,3};
个如果你的汇编程序支持十六进制转义码(GAS或clang),你可以等效地编写
.ascii "\x01\x02\x03"
,但是对于人类读者来说,.byte
版本看起来更像C。.byte
也允许像-2
那样的有符号负值,而不必像.ascii "\xFE"
那样手动计算出2的补码位模式。对于长度超过1个字节的文本字符串,
.ascii "abc"
当然比.byte 'a', 'b', 'c'
.