雖然經歷了一些內聯程序集的C代碼,但我遇到了.byte(在開始處有一個Dot)指令。gnu程序集中.byte彙編程序指令的用途是什麼?
在檢查Web上的程序集引用時,我發現它用於在內存中保留一個字節。
但是在代碼中聲明前沒有標籤。所以我想知道什麼是未標記的.byte指令或任何其他數據存儲指令的用途。
例如,如果我代碼.byte 0x0a
,我該如何使用它?
雖然經歷了一些內聯程序集的C代碼,但我遇到了.byte(在開始處有一個Dot)指令。gnu程序集中.byte彙編程序指令的用途是什麼?
在檢查Web上的程序集引用時,我發現它用於在內存中保留一個字節。
但是在代碼中聲明前沒有標籤。所以我想知道什麼是未標記的.byte指令或任何其他數據存儲指令的用途。
例如,如果我代碼.byte 0x0a
,我該如何使用它?
有幾個可能性...這裏有幾個我能想到的把我的頭頂部:
你可以訪問它相對於自帶後的.byte
指令的標籤。例如:
.byte 0x0a
label:
mov (label - 1), %eax
基於該方案的最後鏈接的佈局,也許.byte
指令都將作爲代碼執行。通常你也會在這種情況下有一個標籤,雖然...
一些彙編程序不支持爲操作數大小等生成x86指令前綴。在爲這些彙編程序編寫的代碼中,您經常會看到一些如:
.byte 0x66
mov $12, %eax
使彙編程序發出你想要的代碼。
該.byte是一個指令,允許您聲明一個只有通過檢查才知道的常量字節,而無需任何上下文。
從GNU彙編程序指南:
.byte 74, 0112, 092, 0x4A, 0X4a, 'J, '\J # All the same value.
這裏的內聯彙編的例子:(見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
將是一樣的。這表明它可以是一個可以表示一些指令或其他指令的字節。
.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
。
來自3)的彙編程序急需一個補丁:-) –
'.byte'和['d *'pseudo-ops]有什麼區別(http://stackoverflow.com/questions/10168743/x86 - 裝配-其中-可變大小使用的-DB-DW-DD)? –
我希望他們是一樣的。 –