Xét đoạn lệnh như sau:
Chương trình chính:
Mã:
...
mov ax,10
call Chương_trình_con
mov cx,ax
Chương trình con:
Ở chương trình chính, ta muốn có cx = ax = 10 nhưng sau khi gọi chương trình con thì giá trị thanh ghi ax đã bị đổi thành 0 (việc giá trị của thanh ghi bị thay đổi chính là phá vỡ thanh ghi) => khi thực hiện câu lệnh mov cx,ax thì giá trị của cx lại là 0 chứ ko phải là 10.
Để giải quyết, ta phải cất giá trị thanh ghi ax vào một chỗ rồi mới thực hiện chương trình con (đây chính là việc bảo vệ thanh ghi). Cụ thể, ta dùng lệnh push để cất giá trị của ax vào stack, sau đó thực thi chương trình con, rồi lấy giá trị ở trong stack ra đưa vào ax => Giá trị của thanh ghi ax vẫn giữ nguyên ko bị thay đổi (ax = 10).
Phải sửa lại Chương trình con thành:
Mã:
...
[U]push ax[/U]
xor ax,ax
[U]pop ax[/U]
ret
-Các lệnh nào có thể làm phá vỡ các thanh ghi ?
Bạn có thể coi những lệnh phá vỡ thanh ghi là những lệnh làm thay đổi giá trị thanh ghi. Như ở ví dụ trên thì có 2 lệnh mov và lệnh xor làm thay đổi giá trị thanh ghi.
-Khi nào thì dùng lệnh push ?
Khi cần bảo vệ giá trị thanh ghi. Thông thường, lệnh push thường được dùng trong chương trình con.