DIV BX OVERFLOW
Toán tử giạ INCLUDE
7.2.1 Chê đoơ địa chư gián tiêp baỉng thanh gh
Trong chê đoơ đị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 toá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ó noơi dung là 1234h . Leơnh MOV AX,[SI] sẽ copy 1234h vào AX .
Giạ sử raỉng noơi dung các thanh ghi và noơi dung cụa boơ 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 leơnh nào sau đađy là hợp lý , offset nguoăn và kêt qụa cụa các leơnh 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ê đoơ đị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ơ coơng vào AX 10 phaăn tử cụa moơt 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 ; taíng con trỏ leđn 2
LOOP ADDITION ; laịp
Ví dú 3 : Viêt thụ túc đeơ đạo ngược moơt 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ê đoơ đị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 ; hoà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