0

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

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

请帮忙...

4

2 回答 2

3

该行只是声明一个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
于 2013-07-28T03:40:23.003 回答
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!
于 2013-07-28T03:29:20.287 回答