Giúp hiểu hướng dẫn X64 TEST

Sep 23 2020

Tôi đã đọc rằng TEST thực hiện một chút khôn ngoan và trên hai đối số. Tôi cũng đã đọc rằng jz và je đều tương đương và nhảy nếu cờ 0 được đặt. Vì vậy, đây là vấn đề tôi đang đấu tranh. Hãy xem xét đoạn mã sau (khá vô dụng):

mov ax, 0x2
test ax, 0x2
je equal
mov ax, 0x0
jmp done
equal:
mov ax, 0x1
done:

Về mặt logic, "nhảy nếu bằng" sẽ nhảy, nhưng 0x2 & 0x2 không nên đặt cờ số không. Như tôi hiểu jz / je sẽ nhảy nếu cờ 0 được đặt, điều này có nghĩa là je không thực hiện một cách hợp lý những gì nó ngụ ý ("nhảy nếu bằng"). Và trong thực tế, mã sẽ rơi xuống và đặt ax thành 0x0, thay vì nhảy và đặt ax thành 0x1.

Bất cứ ai có thể giải thích nơi hiểu biết của tôi là sai? Rõ ràng là tôi không hiểu một cách chính xác điều gì đó.

Cảm ơn!

Trả lời

3 blabb Sep 23 2020 at 16:15

je thường được sử dụng với lệnh cmp như

cmp Reg16/32/64,const
je someplace

trong khi jz thường được sử dụng để kiểm tra cụ thể cho 0 hoặc null như

dec reg16/32/64 
jz someplace

tôi vừa sửa đổi mã của bạn thành một vòng lặp vô hạn và mô phỏng nó trong trình giả lập x86, hãy xem bên dưới để biết mã và gif.

mã

mov ax, 0x2
dec     ax
and     ax, 0x1
jz  equal
je  equal
test    ax, 1
jz  equal
je  equal
cmp     ax, 1
redo:
jz  equal
equal:
je  redo