2011-09-06 30 views
5

Được rồi, vì vậy tôi đang đối phó với những đoạn mã sau đây:kết quả Weird với movzwl,% rìu và giá trị âm

push %ebp 
mov %esp,%ebp 
push %ebx 
mov 0x8(%ebp),%eax 
movzwl %ax,%edx 

Vì vậy, đây cư xử như mong đợi khi giao dịch với giá trị dương. Giá trị được sao chép vào% edx là 16 bit sau của% eax (hoặc% rìu).

Tuy nhiên, nếu bạn đặt số âm vào, mọi thứ sẽ bắt đầu trở nên lạ và dường như không hoạt động như mong đợi.

Ví dụ, nếu giá trị của% eax là -67.043.552, thì giá trị sao chép vào% edx là 65312.

Tôi khá mới để lắp ráp, xin lỗi nếu điều này là một hiểu sai rõ ràng trên một phần của tôi. Mọi sự trợ giúp sẽ rất được trân trọng.

+0

['movswl'] (http://www.felixcloutier.com/x86/MOVSX:MOVSXD.html) khả dụng khi bạn muốn ký gia hạn một giá trị bổ sung có chữ ký của 2 thay vì không mở rộng giá trị không dấu nhị phân. (Xem thêm [x86 tag wiki] (http://stackoverflow.com/tags/x86/info) –

+0

Ngoài ra, nếu bạn in các số của mình dưới dạng hex, nó sẽ ít gây nhầm lẫn/rõ ràng hơn những gì đang diễn ra. –

+0

Ngoài ra, trừ khi bạn thực sự cần giá trị đầy đủ trong '% eax', bạn nên' movzwl 0x8 (% ebp),% edx' trực tiếp thay vì lãng phí một lệnh làm việc đó một cách riêng biệt. CPU Intel có thể xử lý 'movzx' /' movsx' chỉ là một tải uop, không cần ALU. –

Trả lời

16

Hãy nhớ rằng movzwl chỉ sao chép các bit trong %ax vào %edx điền 16 bit cao của %edx bằng số không.

Vì vậy %edx luôn kết thúc với một số dương nhỏ hơn hoặc bằng 65535.

Cụ thể: -67043552 trong hex là fc00ff20. Vì vậy, nếu đó là trong %eax, thì %ax chứa ff20. Nếu bạn di chuyển số đó vào %edx với số không gia hạn, thì %edx sẽ là 0000ff20. Đó là 65312.

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