Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 18

Đổi số decimal sang dạng HEX

-6247 = E799
300 = 012C

Mún chia đầu tiên xác định op là bao nhiu bit ở đây 012C được lưu trữ
trong 16 bit => giá trị bị chia phải lưu trong thanh ghi 32 bit CDW(word
to double word)

Kết quả phép chia sẽ có 2 phần:


Phần dư chứa vào nữa cao: DX = FF09
Phần thương chứa vào nữa thấp: AX = FFEC

Để clear 4 bit cuối thì ta AND vs 4 bit cuối là bit 0 nhưng tả phải giữ lại 4
bit đầu vì để không yêu cầu đổi: F0 hoặc 11110000
MOV AX, 67FE => AX = 67FE
MOV BX, AX => BX = AX = 67FE

MOV CL, BH => CL = 67


MOV CH, BL => CH = FE => CX = FE67

Ta chuyển 2 số về decimal
140h = 320
8h = 8
Nhân lại => kq = 2560 => nó sẽ được lưu(dạng binary) vào trong dx:ax
=> vẫn còn trong phạm vi của thanh ghi 16 bit nên nó sẽ không lấn sang
dx => cờ nhớ (CF) và cờ tràn (OF) ở trạng thái reset

Kết quả ra là -1 => bit dấu được set


Vì đây là phép trừ nên sẽ không tràn
Cờ nhớ được bật lên vì 12AE < 12AF thế nên lúc trừ 2 số nhị phân thì
chắc chắn ta phải nhớ ở 1 vị trí nào đó.

SI = 121 => đang ở vị trí có giá trị là 13


DX là thanh ghi 16 bit => từ vị trí thứ 1 ta sẽ lấy 2 byte kế tiếp so với vị
trí 121 hiện tại tức là lấy giá trị 96 và D0
Mà theo cách viết little edian (phần thấp lên trước và phần cao xuống
dưới) => ta có DX = D096
Tương tự ta có CX = D0E0

MOV AX, 152D => AX = 152D


ADD AX, 003F => AX = 156C
ADD AH, 10 => 156C + 1000 => AX = 256C
=> AH = 25 AL = 6C

Kết quả phép cộng: 010A => đổi qua decimal là 266 > 256(8bit)
=> Cờ nhớ được bật AL = 0A

Kết quả phép nhân là 002FFFD0


Nữa cao DX = 002F
Nữa thấp AX = FFD0

Đổi HEX sang decimal:


17h = 23
DL = 10
10 <= 5 -> sai
10 >= 23 -> sai
=> BX = 10h
DL = 17h
23 <=5 -> sai
23 >= 23 -> đúng
=> BX = 01h
Push SI => giảm 2 byte
=> 1D4E

CX = 7 => lặp 7 lần


Sau 7 lần lặp:
SI từ 300h -> 307h AL từ 10h -> 80h

Đáp án dạng nhị phân: 0000 0001 0000 0000


AL thì chỉ nằm trong 8 bit đầu mà 8 bit đầu tiên là 0000 0000
=> Cần thanh ghi 16 bit để lưu trữ kết quả này
=> Cở nhớ và cờ tràn được set

Đổi số decimal sang dạng HEX


-1024 = FC00
128 = 0080

Mún chia đầu tiên xác định op là bao nhiu bit ở đây 0080 được lưu trữ
trong 16 bit => giá trị bị chia phải lưu trong thanh ghi 32 bit CDW(word
to double word)

Step 1: MOV AX, FC00


Step 2: CWD
Step 3: MOV CX, 80
Step 4: IDIV CX

Thanh ghi AX chứa giá trị 16bit và phải lưu trữ dưới dạng little edian =>
kết quả là: 5A2D

MUL CL => AL nhân với CL kết quả lưu trong AX: 20x10 = 0200
Không đụng tới DX nên DX = 0000

Trong phép nhân không dấu khi phần nữa cao của kết quả khác 0 thì CF
và OF được set = 1
Trong phép nhân có dấu khi phần nữa cao có bit khác với bit cuối cùng
của giá trị nữa thấp thì CF và OF được set = 1
1. Step 1: MOV AX, 01BC (Initialize AX to 449)

2. Step 2: MOV CL, 1 (Shift value)

3. Step 3: SHR AX, CL (Divide 449 by 2)

4. Step 4: MOV BX, 166 (Prepare 358)

5. Step 5: MOV CL, 2 (Shift for division by 4)

6. Step 6: SHR BX, CL and ADD AX, BX

Để chỉ thay đổi thứ tự bit yêu cầu thì ta set vị trí bit đó là 0 còn lại là 1
=> kq: 10010111
Kết quả sau khi nhân: 0FFF6000 bit dấu và bit cuối cùng khác nhau =>
OF và CF được set

Kết quả sau khi nhân:0004FFFB ta có thể thấy nữa cao của kết quả khác
0 => OF và CF được set

Vị trí ban đàu SI là 128 tức là ở vị trí có giá trị 1E


MOV EDX,[SI] => EDX có kết quả( Lấy 4 byte tiếp theo) là: 203E8099
=> DX = 8099
MOV EAX,[SI+4] => EAX có kết quả là: 24750099 => AX = 0099
Kết quả phép nhân vẫn chỉ chứa trong nữa thấp => OF và CF reset

Trong phép nhân có dấu khi phần nữa cao có bit khác với bit cuối cùng
của giá trị nữa thấp thì CF và OF được set = 1
Kết quả phép nhân là: 0000 0000 0000 0000 1111 0101 0000 1010
Chọn ý 1,3,4
Kết quả là: 00000100
=> OF và CF = 0 (reset)

PUSH SI => Giảm 2 byte => 1D4E

POP SI => Tăng 2 byte => 1D4A


Chọn ý 1,4
Ý 2 sai vì dec cx là đã giảm 1 lần mà có lệnh loop lại giảm 1 lần nữa =>
giảm 2 lần
Ý 3 sai vì nếu nó bằng 0 thì mới nhảy lại vô vòng lặp
Chọn ý 2

Chọn A
AX 16bit => 5A2D

MOV AX, 4FCA


ADD AX, DDA9
Kết quả là: 00012D73
ADD AH, F3
=> 00012D73 + 0000F300
=> kết quả là: 0002 2073 này là AX
=> AH = 20
=> AL = 73

Watch point 1: AH = 2D
Watch point 2: AL = 73
MOV AX, 1BC => AX = 444
CL = 2
SHL AX, CL
Dịch trái ta sẽ lấy giá trị hiện tại nhân 2^n lần dịch
=> Giá trị AX = 444x2^2 = 1776
Watch point 1: AX = 1776
ADD AX, 166
=> AX = 1942
Watch point 2: AX = 1942
SHR AX, CL
Dịch phải ta sẽ lấy giá trị hiện tại chia 2^n lần dịch
=> Giá trị AX = 1942 : 2^2 = 485
Watch point 3: AX = 485
SHR AX, CL
=> Giá trị AX = 485 : 2^2 = 121
CLD dùng để set DF = 0 => DI và SI sẽ tăng
STD dùng để set DF =1 => DI và SI sẽ giảm
Ta chọn ý 1 và 4
Lệnh REP để thay thế vòng lắp
Loại ý 2 vì trên đề đưa là tăng SI và DI
Loaị ý 3 vì đã có vòng lặp mà còn dùng lệnh REP

Để clear 7 bit thì phần ko clear ta để bit 1 còn lại ta để bit 0


Đáp án: 10000000
CLD => DI và SI sẽ tăng
Lệnh SCASB chỉ ảnh hưởng tới DI => SI sẽ ko tăng
Vị trí của DI hiện tại là vị trí thứ 10(20A)
Sau 2 lần lặp ta sẽ thấy AX = DI
DI có địa chỉ (20C) giá trị sẽ là 5040
SI giữ nguyên 208h
AX = 0040h

Đáp án là 41BE
AX = BE
DX = 41

You might also like