簡體   English   中英

了解匯編.long指令

[英]Understanding assembly .long directive

在John Viega撰寫的C和C ++安全編程指南中,我遇到了以下聲明

asm("value_stored:    \n"
    ".long 0xFFFFFFFF \n"
);

我不太了解匯編程序中.long指令的用法,但是在這里它用於將預先計算的值嵌入可執行文件中。 我可以以某種方式強制這些字節在可執行文件中的位置嗎? 我嘗試將其放在main的末尾(認為這種方式將在.text節的末尾),但是出現了段錯誤。 將其放在主要作品之外。

即使在main的末尾,內聯匯編程序序列也將生成要執行的代碼。 在我的環境中, objdump -d foo.o顯示:

00000000004004b4 <main>:
  4004b4:   55                      push   %rbp
  4004b5:   48 89 e5                mov    %rsp,%rbp

00000000004004b8 <value>:
  4004b8:   ff                      (bad)  
  4004b9:   ff                      (bad)  
  4004ba:   ff                      (bad)  
  4004bb:   ff                      (bad)  
  4004bc:   b8 01 00 00 00          mov    $0x1,%eax
  4004c1:   5d                      pop    %rbp
  4004c2:   c3                      retq   

可以通過跳過它來緩解

asm("jmp 1f"
    "value: .long 0xffffffff"
    "1:");

關鍵字Nf或Nb創建本地臨時標簽以向前或向后跳轉。

另一個選擇是將變量放置到命名段中,該段可以在鏈接器文件中排序為.text或.data中的最后一個段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM