2013-07-28 34 views
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

請幫助...

回答

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 
+0

好吧...所以當你連接一個字符串和一個數字的數字被轉換成它的ASCII字符串,然後使用它呢? – tenstar

+0

你有其他的方式。彙編中的字符串只是初始化一組字節值的一種便捷方式。字符串中的每個字符都存儲爲一個字節值(它是ASCII值),並按照它們寫入的順序依次存儲。在這種情況下,你不應該把它看作字符串連接,這不是真正發生在這裏的事情。 –

+0

哦...ķ!我知道了.. – tenstar

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! 
+0

好......所以,當您將字符串和一些數字轉換成其ASCII字符串,然後用呢? – tenstar