
KHOA ĐI N T VI N THÔNGỆ Ử Ễ
B MÔN ĐI N T TIN H CỘ Ệ Ử Ọ
-------------------------------
MÔN H C: K THU T VI X LÝỌ Ỹ Ậ Ử
H c kỳ: 2 Năm h c: 2009-2010ọ ọ
ĐÁP ÁN BÀI T P V NHÀ S 3Ậ Ề Ố
Bài 1 (20 đi m).ể Cho tr ng thái c a m t h vi x lý 8086 nh sau:ạ ủ ộ ệ ử ư
Các thanh ghi: AX = 4A86, DX = FF6A, BX = 075C, SI = 0008, DI = 000A, CS = 8BB0,
DS = 4636, IP = 0003, FLAGS = 0000.
B nh :ộ ớ
Đ a ch v t lý:ị ỉ ậ Giá tr 8 ô nhị ớ
M c a: 15 đi mụ ể
M c b: 5 đi mụ ể
a)
CS:0003 02 00 ADD AL, [BX + SI]
; c ng ô nh DS:[BX + SI] vào AL ộ ớ
CS:0005 72 04 JB Label
; Label = IP + 04h vì CF=1
CS:0009 02 61 04 ADD AH, [BX + DI + 4]
; c ng ô nh DS:[BX + DI + 4] vào AH ộ ớ
b) AX = 4A19h và FLAGS = 0011h
Bài 2 (20 đi m).ể
M c a: 10 đi mụ ể
M c b: 5 đi mụ ể
M c c: 5 đi mụ ể
a) Tr c Label3, BX = 0000, CX = 0003, DI = 0000 và các byte t đ a ch SS:SPướ ừ ị ỉ
là: 02 00 05 00 06 00
b)
L nhệCX = 3 CX = 2 CX = 1
pop ax AX 0002 0005 0006
or al, 30h AX 0032 0035 0036
mov [bx][di], al STR ‘2’,‘$’,’$’,‘$’,’$’,‘$’ ‘2’,‘5’,’$’,‘$’,’$’,‘$’ ‘2’,‘5’,’6’,‘$’,’$’,‘$’
inc di DI 0001 0002 0003
c) 256
Bài 3 (30 đi m).ể Vi t l i thân hàm InsertionSort(short A[], short N) cho d i đây b ngế ạ ướ ằ
ASSEMBLY (cho 8086)
T ch c đ c vòng FORổ ứ ượ 10 đi mể

T ch c đ c vòng WHILEổ ứ ượ 10 đi mể
So sánh 2 ph n tầ ử 5 đi mể
Chú thích t tố5 đi mể
void InsertionSort(short A[], short N)
{
__asm {
mov bx, ss:A
mov cx, ss:N
shl cx, 1
mov di, 2
FOR:
cmp di, cx
jae END_FOR
mov ax, [bx][di]
mov si, di
dec si
dec si
WHILE:
test si, 8000h ; hoac cmp si, 0
js END_WHILE ; jb END_WHILE
mov dx, [bx][si]
cmp dx, ax
jbe END_WHILE
mov [bx][si+2], dx
dec si
dec si
jmp WHILE
END_WHILE:
mov [bx][si+2], ax
inc di
inc di
jmp FOR
END_FOR:
}
}
Bài 4 (30 đi m)ể.
Vi t đ c đo n main – ế ượ ạ 5 đi mể
C t các thanh ghi – ấ5 đi mể
Gán đ a ch c a tham s vào ebx – ị ỉ ủ ố 5 đi mể
Ki m tra đi u ki n k t thúc FOR – ể ề ệ ế 5 đi mể
Đ i mã ký t – ổ ự 5 đi mể
Khôi ph c các thanh ghi – ụ5 đi mể

.stack 100
.data
STR DB 100 DUP(?) ; char STR[100]
.code
MAIN PROC
mov ax, @data
mov ds, ax
; gets(STR)
mov ah, 10
lea edx, STR
int 21h
; toupper(STR)
lea eax, STR
push eax
CALL TOUPPER
; puts(STR)
mov ah, 9
lea edx, STR
int 21h
; exit to DOS
mov ah, 4Ch
int 21h
MAIN ENDP
TOUPPER PROC
; c t các thanh ghi vào stack, gán đ a ch offset c a tham s cho ebxấ ị ỉ ủ ố
push ebp
mov ebp, esp
push eax
push edi
mov ebx, [ebp + 16]
; duy t xâu ký tệ ự
xor edi, edi
FOR:
mov al, [ebx][edi] ; al ch a mã ký t đang duy tứ ự ệ
; ki m tra đi u ki n k t thúc vòng forể ề ệ ế
cmp al, 13
je END_FOR
; đ i ký t th ng thành ký t in hoaổ ự ườ ự
cmp al, 'a'
jb NO_CHANGE
cmp al, 'z'
ja NO_CHANGE
sub al, 20h

mov [ebx][edi], al
NO_CHANGE:
inc edi ; duy t ký t ti p theoệ ự ế
jmp FOR
END_FOR:
; khôi ph c các thanh ghiụ
pop edi
pop eax
pop ebp
TOUPPER ENDP
END MAIN

