汇编中的逗号(,)运算符是什么?

时间:2013-07-28 03:23:32

标签: assembly operators comma

这是我编写的一个简单的汇编语言程序:

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

请帮忙......

2 个答案:

答案 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