Cấu trúc bên trong của 8086, các thanh ghi, chế độ địa chỉ, mã hóa lệnh, quản lý bộ nhớ, so sánh cấu trúc bên trong của PIC với 8086Viết lại thân hàm InsertionSort(short A[], short N) cho dưới đây bằng ASSEMBLY (cho 8086)
Trang 1KHOA Đ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 = 4A07, 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ớ
46AC0: A6 43 C0 49 B5 F6 20 64
46AC8: 38 C5 DE 80 29 73 44 E8
8BB00: B8 67 01 02 00 72 04 03
8BB08: C3 02 61 04 03 84 02 00
a) Giải mã 3 lệnh đầu tiên mà CPU sẽ thực hiện và viết các lệnh đó theo mẫu sau (15 điểm):
CS:giá trị của IP các byte mã lệnh lệnh ASEMBLY ; chú thích b) Cho biết giá trị các thanh ghi AX và FLAGS sau lệnh thứ 3 (5 điểm)
Bảng các mã lệnh: tra tại http://www.mlsite.net/8086
Giải:
a
CS:0003 02 00 ADD AL, [BX + SI]
; cộng ô nhớ DS:[BX + SI] vào AL
CS:0005 72 04 JB Label
; Lệnh JB không được thực hiện vì CF = 0
CS:0007 03 C3 ADD AX, BX ; cộng BX vào AX
Label:
b Giá trị các thanh ghi AX và FLAGS sau lệnh thứ 3
AX = 5209h và FLAGS = 0014h
Trang 2Bài 2 (20 điểm) Cho chương trình ASSEMBLY sau:
.stack 100
.data
STR DB 6 DUP(‘$’)
.code
mov bx, 10
Label1:
test ax, ax
xor dx, dx
div bx
inc cx
Label2:
lea bx, STR
xor di, di
Label3:
pop ax
mov [bx][di], al
inc di
Lable4:
END
a) Sau khi thực hiện lệnh trước Label3, cho biết giá trị của các thanh ghi BX, CX, DI
và các byte bắt đầu từ SS:SP? (10 điểm)
b) Điền giá trị vào bảng sau khi thực hiện từng lệnh trong đoạn từ Lable3 đến Lable4 (5 điểm)
c) Cho biết kết quả hiện trên màn hình (5 điểm)
Trang 3Hướng dẫn giải bài 2
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
mov [bx][di], al STR ‘2’,‘$’,’$’,‘$’,’$’,‘$’ ‘2’,‘5’,’$’,‘$’,’$’,‘$’ ‘2’,‘5’,’6’,‘$’,’$’,‘$’
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)
void InsertionSort(short A[], short N) // short – kiểu biến 2 byte
{
for (short i = 1; i < N; i++)
{
short X = A[i];
short j = i – 1;
while (j >= 0 && A[j] > X) {
A[j + 1] = A[j];
j– –;
} A[j + 1] = X;
}
}
Hướng dẫn giải bài 3:
Tổ chức được vòng FOR 10 điểm
Tổ chức được vòng WHILE 10 điểm
Trang 4void 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
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:
}
}
Trang 5Bài 4 (30 điểm) Viết lại chương trình C sau đây bằng ASSEMBLY (cho 80486):
#include <stdio.h>
#include <conio.h>
void toupper(char *s) {
int i = 0;
while (s[i] != 0) {
if (s[i] >= ‘a’ && s[i] <= ‘z’)
s[i] –= 32;
i++;
} }
main()
{
char STR[100];
gets(STR); // hàm nhập xâu ký tự toupper(STR);
puts(STR); // hàm in xâu ký tự }
Chú ý: Các hàm puts và gets có thể dùng ngắt 21h Hàm toupper cần được viết
dưới dạng chương trình con
Hướng dẫn giải bài 4:
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
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
Trang 6; 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