2013-03-03 29 views
16

Sự hiểu biết của tôi về sổ đăng ký lắp ráp nói rằng mỗi đăng ký có thể được truy cập bằng toàn bộ mã 32 bit và được chia thành nhiều thanh ghi có thể truy cập. Trong ví dụ này, EAX là thanh ghi 32 bit, nếu chúng ta gọi AX, nó sẽ trả lại 16 bit đầu tiên và nếu chúng ta gọi AH hoặc AL thì nó sẽ trả về 8 bit tiếp theo sau 16 bit và AL sẽ trả lại 8 bit cuối cùng.Bộ nhớ lập trình lắp ráp Phân bổ EAX vs Axe, AH, AL

Vì vậy, câu hỏi của tôi, bởi vì tôi không thực sự tin rằng đây là cách nó hoạt động. Nếu chúng ta lưu trữ một giá trị 32 bit của bảy ... aka EAX lưu trữ

0000 0000 0000 0000 0000 0000 0000 0111 

Vì vậy, nếu chúng ta gọi là AX nó nên trở

0000 0000 0000 0000 

nếu chúng ta gọi là AH nó nên trở

0000 0000 

và khi chúng tôi gọi AL, nó sẽ trả lại

0000 0111 

Điều này có đúng không? và nếu cuộc gọi đến số AH thực sự mang lại giá trị gì?

+0

Không, giá trị của bạn cho AX là sai. Hack ra 16 bit cuối cùng. AH chỉ trả về các bit từ 8 đến 15 của EAX. –

+1

hãy thay thế mẫu bit bằng thứ gì đó dễ hiểu hơn trong ngữ cảnh câu hỏi của bạn, ví dụ: 0000 0001 0010 0011 ... –

Trả lời

33

Không, điều đó không đúng.

EAX is the full 32-bit value 
AX is the lower 16-bits 
AL is the lower 8 bits 
AH is the bits 8 through 15 (zero-based) 

Edit:

Để hoàn chỉnh, ngoài việc nêu trên, được dựa trên một CPU 32-bit, CPU Intel/AMD 64-bit có

RAX, which hold a 64-bit value, and where EAX is mapped to the lower 32 bits. 
+0

Vì vậy, bạn có thể nói rằng sự hiểu lầm của tôi sẽ đến từ Axe là top 16, nhưng thay vào đó gọi đến giá trị chứa cả Al và Ah? – Randy

+0

Cảm ơn sự giúp đỡ, điều này đã xóa rất nhiều. Một lỗi ngớ ngẩn như vậy – Randy

+0

làm thế nào để bạn gọi các bit 16 bit cao hơn và cao hơn? Có EAXH hoặc AXH không? – user97662

4

Không - AL là 8 bit quan trọng nhất của AX. AX là 16 bit quan trọng nhất của EAX.

Có lẽ cách dễ nhất để giải quyết nếu chúng tôi bắt đầu với 04030201h trong chế độ chờ. Trong trường hợp này, AX sẽ chứa 0201h, AH wil chứa 02h và AL sẽ chứa 01h.

18

AX là 16 bit thấp hơn của EAX. AH là 8 bit cao của AX (tức là các bit 8-15 của EAX) và AL là byte ít quan trọng nhất (bit 0-7) của EAX cũng như AX.

Ví dụ (Hexadecimal chữ số):

EAX: 12 34 56 78

AX: 56 78

AH: 56

AL: 78

4

không ans của bạn là Sai

Lựa chọn Al và Ah là từ AX chứ không phải từ EAX

e.g

EAX=0000 0000 0000 0000 0000 0000 0000 0111 

Vì vậy, nếu chúng ta gọi là AX nó nên trở

0000 0000 0000 0111 

nếu chúng ta gọi là AH nó nên trở

0000 0000 

và khi chúng ta gọi là AL nó nên trở

0000 0111 

Ví dụ số 2

EAX: 22 33 55 77 
AX: 55 77 
AH: 55  
AL: 77 

dụ 3

EAX: 1111 0000 0000 0000 0000 0000 0000 0111  
AX= 0000 0000 0000 0111 
AH= 0000 0000 
AL= 0000 0111 
+1

Bất kỳ điều gì cần làm với người cuối cùng? Nếu tôi làm 'movl $ 0x01% eax' lắp ráp với _GAS_, giá trị của'% ax' và '% al' sẽ là gì? Một hoặc không? –

+0

@FrozenFlame: Không, tính cuối cùng chỉ áp dụng cho bộ nhớ (bao gồm cách lệnh 'mov $ imm32,% eax' được mã hóa, như' opcode 01 00 00 00'.). Giá trị trong% al sẽ là '1'. Left-shifting% eax hoạt động nếu bạn nghĩ về MSB ở bên trái, LSB ở bên phải trong thanh ghi. (Điều này có thể phức tạp đối với các thanh ghi vector, xem https://stackoverflow.com/questions/41351087/convention-for-displaying-vector-registers) –

3

Đoạn dưới đây kiểm tra EAX sử dụng GDB.

(gdb) info register eax 
    eax   0xaa55 43605 
    (gdb) info register ax 
    ax    0xaa55 -21931 
    (gdb) info register ah 
    ah    0xaa -86 
    (gdb) info register al 
    al    0x55 85 
  1. EAX - Full giá trị 32 bit
  2. AX - thấp hơn giá trị 16 bit
  3. AH - Bits 8-15
  4. AL - 8 bit thấp của EAX/AX
+0

bạn cũng có thể in các thanh ghi trong gdb bằng 'p/x $ eax' (hoặc bỏ qua '/ x' cho thập phân). Và sửa đổi chúng với 'set $ eax = 0xdeadbeef', IIRC. Xem thêm phần dưới cùng của [tag wiki x86] (https://stackoverflow.com/tags/x86/info) để biết một số mẹo gdb cho asm. –