这是我编写的一个简单的汇编语言程序:
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
请帮忙......
答案 0 :(得分:1)
逗号运算符与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!
答案 1 :(得分:1)
该行只是在数据段中声明一个名为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