2014-02-26 106 views
1

我正在閱讀Richard C. Detmer編寫的題爲「80x86彙編語言和計算機體系結構導論」的教科書,並且在第59頁上討論了彙編語言中的BYTE指令,並將其用於字符和字符串。以下是全文:程序集中的BYTE指令

「除了數字操作數,則BYTE指令允許字符操作數與單個字符或字符串操作數以衆多人物無論是單引號(')或引號(」)可以用於指定字符或分隔字符串。他們必須成對;你不能在左邊放一個撇號,在右邊放一個引號。用引號分隔一個用單引號標記可以包含引號的字符串,可以包含撇號,使其能夠擁有包含這些特殊字符的字符串。」

這是很可以理解的,但我的好奇心線是BYTE指令,因爲我認爲它只能容納一個字節,八位。我做了一個測試,如果我說

string BYTE "HelloWorld" 

它將編譯過程,但如果您選中了十六進制,你會發現它不只是一個單字節但多個字節。查看一個ASCII表,我們已經知道一個CH字符是一個字節。那麼我們怎麼能有字符串?我試圖用數字來應用這個。我們知道,對於BYTE指令是從-128到255的範圍內我想這樣的代碼:

number BYTE 9987 

,當我試圖編譯和運行,我得到了一個錯誤,因爲當然9987的比一個字節大。但爲什麼字符串免疫這個?爲什麼BYTE指令在字符串的上下文中保持多於一個字節,但是不能與數字相同?

我會想象當我編譯並運行我列出的第一個代碼聲明與第二個聲明有相同的錯誤。爲什麼「規則」在這裏打破?

-Dan

+0

還有什麼不明白嗎?這本書說這是合法的。如果你認爲不同,你一定是錯的。這裏有什麼問題。 – EJP

+0

@EJP是的我知道這是合法的,這不是問題。問題是爲什麼它是合法的。瞭解某件事是合法的,與理解它是完全不同的。我知道我可以做到,但我想知道爲什麼。你沒看過我的帖子嗎? –

回答

2

注意,沒有一個單一的彙編語法,不同的程序可能會使用不同的語法。你應該諮詢你的彙編手冊。

也就是說,字符串常量通常只是每個字符的簡寫符號,而​​指令允許一次定義多個項目。

因此,例如,BYTE 1, 2, 3, 4是有效的並且定義了4個字節,並且您的string BYTE "HelloWorld"等同於string BYTE 'H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd'並且定義了10個字節。你沒有得到錯誤的原因是因爲每個字符本身都適合一個字節。

有些彙編程序甚至不允許​​或等效指令中的字符串文字,它們具有專門的字符串指令,例如.string.ascii

3

​​指令告訴彙編器保留一個存儲塊並記住它的長度(以字節爲單位)。長度取決於初始化程序中的字節數,可以是0到255之間的數字,也可以是單引號中的字符。字符串在編程語言中很常見,通常被認爲是內存中連續字節的字符數組。爲了方便程序員,彙編程序允許您通過在單引號或雙引號中指定字符串來保留初始化爲字符串的一系列字節。這些等同

string1 BYTE 'H', 'e', 'l', 'l', 'o' 

string1 BYTE 'Hello' 

一些裝配有這種不同的指令,例如甲骨文的Solaris x86彙編語言有

  • .byte指令,它只是需要字節
  • .ascii需要一個不會被NUL終止的字符串的指令
  • .string指令,需要一個字符串,will被NUL結尾