2011-09-03 26 views
8

Trong khi đi qua một số mã C có lắp ráp nội tuyến tôi đi qua các .byte (với một dấu chấm ở đầu) chỉ thị.Việc sử dụng chỉ thị assembler .byte trong hội đồng gnu là gì?

Khi kiểm tra tham chiếu lắp ráp trên web, tôi thấy rằng nó được sử dụng để đặt trước một byte trong bộ nhớ.

Nhưng trong mã không có nhãn trước báo cáo. Vì vậy, tôi đã tự hỏi những gì đang sử dụng một chỉ thị .byte không dán nhãn hoặc bất kỳ chỉ thị lưu trữ dữ liệu nào khác cho vấn đề đó.

Ví dụ: nếu tôi mã số .byte 0x0a, tôi có thể sử dụng nó như thế nào?

Trả lời

5

Có một vài khả năng ... đây là một vài tôi có thể nghĩ ra khỏi đỉnh đầu của tôi:

  1. Bạn có thể truy cập vào nó liên quan đến một nhãn mà đến sau chỉ thị .byte . Ví dụ:

    .byte 0x0a 
    label: 
        mov (label - 1), %eax 
    
  2. Dựa trên cách bố trí liên kết cuối cùng của chương trình, có thể .byte chỉ thị sẽ được thực hiện dưới dạng mã. Thông thường, bạn cũng có một nhãn trong trường hợp này, mặc dù ...

  3. Một số trình kết nối không hỗ trợ tạo tiền tố hướng dẫn x86 cho kích thước toán hạng, v.v. như:

    .byte 0x66 
        mov $12, %eax 
    

    Để làm cho trình tạo thành mã bạn muốn có.

+1

Bộ lắp ráp đó từ 3) cần bản vá, khẩn trương :-) –

+0

Sự khác biệt giữa '.byte' và [' d * 'pseudo-ops] là gì (http://stackoverflow.com/questions/10168743/x86 -assembly-which-variable-size-to-use-db-dw-dd)? –

+0

Tôi mong chúng giống nhau. –

0

.byte là chỉ thị cho phép bạn khai báo một byte không đổi chỉ được kiểm tra thông qua kiểm tra mà không có bất kỳ ngữ cảnh nào.

Từ Assembler Hướng dẫn GNU:

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

Dưới đây là một ví dụ với lắp ráp inline: (. Xem 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; 
} 

Bạn có thể thay .byte 0xb8, 0x01, 0x00, 0x00, 0x00 với mov $1, %%eax kết quả chạy sẽ giống nhau. Điều này chỉ ra rằng nó có thể là một byte mà có thể đại diện cho một số hướng dẫn eg- di chuyển hoặc những người khác.

1

.byte kích hoạt byte bất kể bạn ở đâu. Cho dù có một nhãn hoặc không trỏ đến byte, không quan trọng.

Nếu bạn tình cờ ở trong phân đoạn văn bản, thì byte đó có thể chạy như mã.

Carl đề cập đến nó, nhưng đây là một ví dụ hoàn chỉnh để cho nó chìm trong hơn nữa: một x86_64 Linux thực hiện true với một nop ném vào:

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

tạo ra chính xác cùng thực thi như:

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

kể từ nop được mã hóa dưới dạng byte 0x90.

Các vấn đề liên quan