2011-09-03 92 views
8

雖然經歷了一些內聯程序集的C代碼,但我遇到了.byte(在開始處有一個Dot)指令。gnu程序集中.byte彙編程序指令的用途是什麼?

在檢查Web上的程序集引用時,我發現它用於在內存中保留一個字節。

但是在代碼中聲明前沒有標籤。所以我想知道什麼是未標記的.byte指令或任何其他數據存儲指令的用途。

例如,如果我代碼.byte 0x0a,我該如何使用它?

回答

5

有幾個可能性...這裏有幾個我能想到的把我的頭頂部:

  1. 你可以訪問它相對於自帶.byte指令的標籤。例如:

    .byte 0x0a 
    label: 
        mov (label - 1), %eax 
    
  2. 基於該方案的最後鏈接的佈局,也許.byte指令都將作爲代碼執行。通常你也會在這種情況下有一個標籤,雖然...

  3. 一些彙編程序不支持爲操作數大小等生成x86指令前綴。在爲這些彙編程序編寫的代碼中,您經常會看到一些如:

    .byte 0x66 
        mov $12, %eax 
    

    使彙編程序發出你想要的代碼。

+1

來自3)的彙編程序急需一個補丁:-) –

+0

'.byte'和['d *'pseudo-ops]有什麼區別(http://stackoverflow.com/questions/10168743/x86 - 裝配-其中-可變大小使用的-DB-DW-DD)? –

+0

我希望他們是一樣的。 –

0

該.byte是一個指令,允許您聲明一個只有通過檢查才知道的常量字節,而無需任何上下文。

從GNU彙編程序指南:

.byte 74, 0112, 092, 0x4A, 0X4a, 'J, '\J # All the same value. 
2

這裏的內聯彙編的例子:(見compiler asm output and also disassembly of the final binary on the Godbolt compiler explorer

#include <stdio.h> 
void main() { 
    int dst; 
    // .byte 0xb8 0x01 0x00 0x00 0x00 = mov $1, %%eax 
    asm (".byte 0xb8, 0x01, 0x00, 0x00, 0x00\n\t" 
    "mov %%eax, %0" 
    : "=r" (dst) 
    : : "eax" // tell the compiler we clobber eax 
    ); 
    printf ("dst value : %d\n", dst); 
return; 
} 

您可以mov $1, %%eax 運行結果替換.byte 0xb8, 0x01, 0x00, 0x00, 0x00將是一樣的。這表明它可以是一個可以表示一些指令或其他指令的字節。

1

.byte吐出字節無論你在哪裏。是否有標籤或不指向字節,無所謂。

如果您碰巧在文本段中,那麼該字節可能會像代碼一樣運行。

卡爾提到這個問題,但這裏是一個完整的例子讓它進一步下沉:用nop一個Linux x86_64的實施true拋出:

.global _start 
_start: 
    mov $60, %rax 
    nop 
    mov $0, %rdi 
    syscall 

產生完全相同的可執行文件:

.global _start 
_start: 
    mov $60, %rax 
    .byte 0x90 
    mov $0, %rdi 
    syscall 

因爲nop被編碼爲字節0x90

相關問題