PDA

View Full Version : hỏi về 1 đoạn asm code



growup
06-12-2004, 03:22
trong khi làm prj, mình gặp 1 lỗi tại dòng sau:

mov ax,es:[si]
vấn đề là nếu si nhận 1 giá trị bất kì <> 0ffffh thì ko có gì , nhưng nếu cho si nhận giá trị là 0ffffh thì chương trình gặp lỗi và thoát ra ngay.
Mình viết thử 1 cái test để kiểm tra thì đúng là lỗi xảy ra với dòng code trên nếu si=0ffffh:
;----------------------------------------------------------
.model small
.code
org 100h
start:
jmp main
main
mov ax,0
mov es,ax
mov si,0ffffh ;si=0ffffh
mov ax,es:[si] ; <--------error
mov ah,2
mov dl,'O'
int 21h
mov ah,4ch
int 21h
RET
main EndP
end start
;----------------------------------------------------
trong test trên nếu si <> 0ffffh thì chữ 'O' sẽ được in ra, nếu gặp lỗi tai dòng đã chỉ ra thì chương trình thoát ngay tại đấy và các lệnh sau ko được thi hành (chữ '0' ko in ra ).
các bạn giải thích cho mình vụ này với !

bete
06-12-2004, 14:07
Thân gửi growup: bạn thử đổi "mov ax,es:[si] ;" thành "mov al,es:[si] ;" coi sao:

1) ngay sau "mov ax,es:[si] ;" bạn để "mov ah,2" => sẽ ghi đè lên ah

2) es:0ffffh là byte cuối cùng của segment; "mov ax,es:[si] ;": ghi vô al và ah => sẽ
cần đọc 2 byte bắt đầu từ es:0ffffh: đọc được byte thứ nhứt (tại es:0ffffh), nhưng còn byte thứ hai sẽ đọc tại đâu !?

(có gì sai sót xin các bạn chỉ giúp, cám ơn nhiều)

-thân

growup
07-12-2004, 13:31
yesssssssssss!

es:0ffffh là byte cuối cùng của segment; "mov ax,es:[si] ;": ghi vô al và ah => sẽ
cần đọc 2 byte bắt đầu từ es:0ffffh: đọc được byte thứ nhứt (tại es:0ffffh), nhưng còn byte thứ hai sẽ đọc tại đâu !?
đọc đên chỗ mov al,es:[si] thì biết là mình ngu rồi , cảm ơn bạn nhiều.

1) ngay sau "mov ax,es:[si] ;" bạn để "mov ah,2" => sẽ ghi đè lên ah

còn giá trị của ax thì mình chẳng cần gì vì đây chỉ là cái test cho mov ax,es:[si] thôi mà :)

growup
07-12-2004, 13:39
yesssssssssss!

es:0ffffh là byte cuối cùng của segment; "mov ax,es:[si] ;": ghi vô al và ah => sẽ
cần đọc 2 byte bắt đầu từ es:0ffffh: đọc được byte thứ nhứt (tại es:0ffffh), nhưng còn byte thứ hai sẽ đọc tại đâu !?
đọc đên chỗ mov al,es:[si] thì biết là mình ngu rồi , cảm ơn bạn nhiều.

1) ngay sau "mov ax,es:[si] ;" bạn để "mov ah,2" => sẽ ghi đè lên ah

còn giá trị của ax thì mình chẳng cần gì vì đây chỉ là cái test cho mov ax,es:[si] thôi mà :)