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