Bài tập Vi xử lý có đáp án số 3

6 3.6K 52
Bài tập Vi xử lý có đáp án số 3

Đang tải... (xem toàn văn)

Thông tin tài liệu

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)

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ử 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 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 Bài 2 (20 điểm). Cho chương trình ASSEMBLY sau: .stack 100 .data STR DB 6 DUP(‘$’) A DW 100h .code mov ax, @data mov ds, ax mov ax, A mov bx, 10 xor cx, cx Label1: test ax, ax jz Label2 xor dx, dx div bx push dx inc cx jmp Label1 Label2: lea bx, STR xor di, di Label3: pop ax or al, 30h mov [bx][di], al inc di loop Label3 Lable4: mov dx, bx mov ah, 9 int 21h 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) Lệnh CX = ? … CX = ? pop ax AX … or al, 30h AX … mov [bx][di], al STR … inc di DI … c) Cho biết kết quả hiện trên màn hình (5 điểm) Hướ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. 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) 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 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 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 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 Đổ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

Ngày đăng: 16/05/2014, 23:16

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan