这是我编写的一个简单的汇编语言程序:
section .text
global main ;must be declared for linker (ld)
main: ;tells linker entry point
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Hello, world!', 0xa ;our dear string
len equ $ - msg ;length of our dear string
现在我不知道这一行发生了什么:msg db 'Hello, world!', 0xa
我知道msg db 'Hello, world!'
的含义,但是当我看到逗号和之后的0xa
时,问题就出现了。
经过一些研究,我知道0xa
会导致换行符,但我只是不明白为什么在那里使用逗号?
是某种串联还是什么?像 C(++( 语法:cout << "asdfsdf" << var;
或者可能是Java语法:System.out.println("Hello,"+var+"!");
或python语法:print 'Yo '+var
请帮忙...
该行只是在数据细分受众群中声明名为 msg
的标签。 msg
指向一个用字符Hello, world!
初始化的字节缓冲区,紧跟换行符(0x0A(。 后面的行通过取当前地址和msg
标签之间的差值来计算字符串的长度。 len
符号将保持该长度。 逗号的使用不是运算符,它只是用于初始化缓冲区的值之间的分隔符。
字符串在大多数(如果不是全部(汇编语言中被特别处理,以使其更方便编写。 这样,您就不必写出该字符串中的每个字符。
以下声明是等效的:
str1 db 'abcde'
str2 db 0x61, 'bc', 'd', 101
; 'a' is 0x61 hex
; 'e' is 101 decimal
请注意,它们通常不会自动包含空终止符。 这就是为什么您通常会看到这样声明的字符串的原因:
message db 'Hello world', 0
逗号运算符与 db
一起使用时是一个串联。
换行符 ( 0xa
( 连接到'Hello, world!'
末尾的原因是,在显示字符串时,最好在后面包含一个换行符。
没有它,如果你循环这段代码,你会得到:
Hello, world!Hello, world!Hello, world!Hello, world!Hello, world!Hello, world!
但是换行符:
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!