Giúp hiểu hướng dẫn X64 TEST
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
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