DIV BX OVERFLOW
7.2.1 Chê đ địa chư gián tiêp baỉng thanh gh
Trong chê đ địa chư gián tiêp baỉng thanh ghi , địa chư offset cụa toán háng được chưá trong 1 thanh ghi . Chúng ta nĩi raỉng thanh ghi là con trỏ ( pointer) cụa vị trí nhớ . Dáng tốn háng là [register]. Trong đĩ register là các thanh ghi BX, SI , DI , BP. Đơi với các thanh ghi BX , SI , DI thì thanh ghi đốn là DS . Cịn thanh ghi đốn cụa BP là SS .
Ví dú : giạ sử raỉng SI = 100h và từ nhớ tái địa chư DS:0100h cĩ ni dung là 1234h . Leơnh MOV AX,[SI] sẽ copy 1234h vào AX .
Giạ sử raỉng ni dung các thanh ghi và ni dung cụa b nhớ tương ứng là như sau :
Thanh ghi noơi dung offset noơi dung boơ nhớ AX 1000h 1000h 1BACh
SI 2000h 2000h 20FFh DI 3000h 3000h 031Dh Ví dú 1:
Hãy cho biêt lnh nào sau đađy là hợp lý , offset nguoăn và kêt qụa cụa các lnh hợp lý . a. MOV BX,[BX] b. MOV CX,[SI] c. MOV BX,[AX] d. ADD [SI],[DI] e. INC [DI]
Chương 7 : Mạng và các chê đ địa chư 83 Lời giại :
Source offset Result
a. 1000h 1BACh
b. 2000h 20FFh
c. illegal source register ( must be BX,SI,DI) d. illegal memory-memory add
e. 3000h 031Eh
Ví dú 2 : Viêt đốn mã đeơ cng vào AX 10 phaăn tử cụa mt mạng W định nghĩa như sau :
W DW 10,20,30,40,50,60,70,80,90,100 Giại : Giại :
XOR AX,AX ; xoá AX
LEA SI,W ; SI trỏ tới địa chư cơ sở ( base) cụa mạmg W . MOV CX,10 ; CX chưá sơ phaăn tử cụa mạng
ADDITION:
ADD AX,[SI] ; AX=AX + phaăn tử thứ nhât ADD SI,2 ; tng con trỏ leđn 2
LOOP ADDITION ; laịp
Ví dú 3 : Viêt thụ túc đeơ đạo ngược mt mạng n từ . Đieău này cĩ nghĩa là phaăn tử thứ nhât sẽ đoơi thành phaăn tử thứ n , phaăn tử thứ hai sẽ thành phaăn tử thứ n-1 ... Chúng ta sẽ dùng SI như là con trỏ cụa mạng cịn BX chứa sơ phaăn tử cụa mạng ( n từ ) .
Giại : Sơ laăn trao đoơi là N/2 laăn . Nhớ raỉng phaăn tử thứ N cụa mạng cĩ địa chư A+2x(N-1)
Đốn mã như sau : REVERSE PROC ; input: SI= offset of array ; BX= number of elements ; output : reverse array
PUSH AX ; cât các thanh ghi PUSH BX
PUSH CX PUSH SI PUSH DI ; DI chư tới phaăn tử thứ n
Chương 7 : Mạng và các chê đ địa chư 84 MOV DI,SI ; DI trỏ tới từ thứ nhât
MOV CX,BX ; CX=BX=n : sơ phaăn tử DEC BX ; BX=n-1
SHL BX,1 ;BX=2x(n-1)
ADD DI,BX ;DI = 2x(n-1) + offset cụa mạng : chư tới phaăn tử ; thứ n
SHR CX,1 ;CX=n/2 : sô laăn trao đoơi ; trao đoơi các phaăn tử
XCHG_LOOP:
MOV AX,[SI] ; lây 1 phaăn tử ở nửa thâp cụa mạng XCHG AX,[DI] ; đưa nĩ leđn nửa cao cụa mạng MOV [SI],AX ; hồn thành trao đoơi
ADD SI,2 ; SI chư tới phaăn tử tiêp theo cụa mạng SUB DI,2 ; DI chư tới phaăn tử thứ n-1
LOOP XCHG_LOOP POP DI POP SI POP CX POP BX POP AX RET REVERSE ENDP