01/10/2018, 09:29

Biến trong assembly

Mình có đoạn code:

.model small
.data 
.code
    main proc 
      mov ah,var1      
      mov dl,"*"
      int 21h
   endp
   end main

Và đoạn code:

.model small
.data
   var1 db 2   
.code
    main proc 
      mov ah,2    
      mov dl,"*"
      int 21h
    endp
    end main

Hai code trên khi chạy cho hai kết quả khác nhau trong khi var1 = 2 ??.Tại sao lại như vậy?.Ai giải thích cho mình với ?

Trần Ngọc Khoa viết 11:33 ngày 01/10/2018

Cái đoạn trên bạn đã khai báo var 1 đâu. Đoạn dưới thì khai báo var1 nhưng mà lại sử dụng giá trị 2 thay vì var1.

newbie lập trình viết 11:35 ngày 01/10/2018

Mình viết nhầm ấy mà
Code1:

model small
.data 
var1 db 2
.code
main proc 
mov ah,var1 
mov dl,"*"
int 21h

Code2:

model small
.data 
.code
main proc 
mov ah,2
mov dl,"*"
int 21h

Bạn giải thích giúp mình đi

Trần Ngọc Khoa viết 11:41 ngày 01/10/2018

mình ko có IDE nên ko biết nó in ra cái gì. nhưng bạn thử thay dấu ngoặc kép thành ngoặc đơn và biến thành kiểu hex thử. 2 thành 2h.

Chắc mục đích của bạn là in ra dấu “*”. Dấu * là một ký tự nên mình nghĩ bạn dùng ‘*’ mới đúng.

newbie lập trình viết 11:36 ngày 01/10/2018

Ở code1,mình đã thay dấu “” thành ‘’ nhưng nó vẫn ra cùng 1 lỗi

INT 21h, AH=0CDh - not supported yet.
refer to the list of supported interrupts.

Hình như giá trị đưa vào vùng nhớ ah không đúng

Lê Tuấn Anh viết 11:40 ngày 01/10/2018

Do bạn chưa khởi tạo giá trị cho thanh ghi DS cho nên nó trỏ đến segment PSP (program segment prefix) (đây là vùng nhớ chứa các thông tin cần thiết cho chương trình của bạn, và hệ điều hành DOS tự động khởi tạo giá trị cho thanh ghi DS trỏ vào vùng nhớ này) chứ không phải là segment chứa biến var1 của bạn. Bởi vậy bạn cần phải khởi tạo giá trị cho thanh ghi DS trước.

Code như sau:

.model small
.stack 100h
.data 
   var1 db 2
.code
   main proc
           mov ax,@data
           mov ds,ax    //Khởi tạo giá trị cho thanh ghi DS


mov ah,var1 
               mov dl,"*"
               int 21h

mov ax,4c00h  //Trở về DOS
               int 21h
     end proc
Bài liên quan
0