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
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 nhCX = 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 t5 đ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