• [THÔNG BÁO] CẢNH BÁO LỪA ĐẢO MẠO DANH QUẢN TRỊ VIÊN
    Chào các thành viên GameVN,
    Dạo gần đây tình trạng lừa đảo scamming và phishing đang gia tăng. Ban quản trị GameVN xin lưu ý toàn bộ thành viên:
    KHÔNG/ ĐỪNG / CẤM cho bất kỳ ai tự xưng là quản trị viên của server vay tiền.
    Mọi hành vi lân la làm quen, tự tiện nhắn tin trên Discord, Facebook, Zalo hoặc các nền tảng mạng xã hội khác,
    núp bóng dưới danh nghĩa sinh hoạt của quản trị viên, đều có tỉ lệ rất, rất cao là lừa đảo.
    Nếu có tài khoản lạ add friend hoặc nhắn tin xin tiền dưới danh nghĩa admin:
    Block ngay
    Report ngay
    Không chuyển khoản, không cung cấp thông tin cá nhân


    Quản trị viên của forum và Discord server GameVN không có nhu cầu vay tiền thành viên.
    Không có lý do nào để admin chủ động kết bạn rồi xin tiền.
    Mọi thông báo chính thức chỉ được đăng trên kênh thông báo của server và topic chính thức trên forum.
    Tin nhắn riêng từ tài khoản lạ không phải thông báo của ban quản trị.
    Cảm ơn các bạn đã chú ý và cùng giữ cộng đồng an toàn.
    — Ban quản trị GameVN

    Tắt thông báo bằng nút X bên góc phải của bảng thông báo*

Cho hỏi về lệnh push của Assembler

HINCODON

Persian Prince
Lão Làng GVN
Tham gia ngày
30/4/05
Bài viết
3,848
Reaction score
2,728
Lệnh push để bảo vệ các thanh ghi bị phá vỡ.Vậy "bảo vệ" là thế nào ? Các lệnh nào có thể làm phá vỡ các thanh ghi? Khi nào cần dùng lệnh push
Nhờ mọi người giúp
 
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:
Mã:
...
xor ax,ax
ret

Ở 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.
 
thanks nhá hiểu rồi
mình cũng có thể viết là :
move ax,10
push ax
call chuong_trinh_con
pop ax
mov cx,ax đc đúng ko
 
Đúng rồi.

Nhưng nếu chương trình con không có sử dụng các lệnh làm thay đổi thanh ghi thì cũng không cần thiết phải sử dụng push và pop.

Khi sử dụng push, lưu ý việc tràn stack (stack over flow) và pop nhầm giá trị trong stack ra thanh ghi :D
 
Back
Top