实验三 高级汇编程序设计
一. 实验目的
1、汇编语言宏程序设计;
2、 掌握中断服务子程序的编写。
二. 实验内容
1、编写一个宏,求三个数的最小数,原型为:MIN3 x,y,z,min
2、挂接1CH中断,正计时60秒后退出。要求屏幕显示0-59的秒数。
3、VC++中编写内联汇编,将字节数组char dbyte[] = {0x34,0x45,0x56,0x67,0xaf}的每个元素高低四位互换,并显示出来。
三. 实验过程和程序
1、编写一个宏,求三个数的最小数,原型为:MIN3 x,y,z,min
MIN3 MACRO x,y,z,min
MOV BL,x
MOV BH,y
MOV CL,z
CMP BL,BH
JB S
CMP BH,CL
JB B2
MOV AL,CL
JMP DONE
S:
CMP BL,CL
JB B1
MOV AL,CL
JMP DONE
B2:MOV AL,BH
JMP DONE
B1:MOV AL,BL
JMP DONE
DONE:
MOV DL,AL
MOV AH,2
ADD DL,30H
INT 21H
ENDM
DATA SEGMENT
output DB 0ah,0dh,“min=”,"$"
MIN_DATA DB 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA DX,output
MOV AH,9
INT 21H
MIN3 3,2,1,MIN_DATA
MOV AH,4CH
INT 21H
CODE ENDS
END START
2、挂接1CH中断,正计时60秒后退出。要求屏幕显示0-59的秒数。
stack segment stack
dw 512 dup(?)
stack ends
data segment
oldisr dw ?,?
counter db 100
line db 0dh,0ah,’$'
isdone db 0
count db 0
data ends
code segment
assume cs:code,ds:data,ss:stack
start: mov ax,data
mov ds, ax
mov ax,0
mov es,ax
cli;关中断
mov ax,es:[1ch*4]
mov oldisr[0],ax
mov ax,es:[1ch*4+2]
mov oldisr[2],ax
mov word ptr es:[1ch*4],offset isr
mov word ptr es:[1ch*4+2],seg isr
sti;开中断,进行系统调用
again: cmp isdone,60
jz done;执行完毕必须得要跳出中断
jnz again
done: mov ax,oldisr[0]
mov es:[1ch*4],ax
mov ax,oldisr[2]
mov es:[1ch*4+2],ax
mov ah,4ch
int 21h
isr proc far;系统调用
push ax
push bx
push dx
sti;
inc count
cmp count ,1000/55;利用中断来确定秒数
jb next
mov count,0
mov al,isdone
xor ah,ah
mov bl,0ah
div bl;做除法后余数放在ah,商放在al
mov dh,ah;开始输出
mov dl,al
mov ah,02h
add dl,30h
int 21h
mov ah,02h
mov dl,dh
add dl,30h
int 21h
mov ah,09h;换行
mov dx,offset line
int 21h
inc isdone
next: pushf
call dword ptr oldisr
cli;关闭中断
pop dx
pop bx
pop ax
iret
code ends
end start
3、VC++中编写内联汇编,将字节数组char dbyte[] = {0x34,0x45,0x56,0x67,0xaf}的每个元素高低四位互换,并显示出来。
*#include********
********using namespace std;********
********int main()********
********{********
********char dbyte[] = { 0x34, 0x45, 0x67, 0xaf };********
********for (int i = 0; i < 4; i++){********
********cout << int(dbyte[i]) << " ";********
********}********
********cout << endl;********
********_asm{********
********mov esi,0********
********mov ecx,4********
********again:********
********mov dl, dbyte[esi]********
********mov eax,0********
********snext:********
********ror dl,1********
********inc eax********
********cmp eax,4********
********jne snext********
********mov dbyte[esi],dl********
********add esi,1********
********loop again********
********}********
********for (int i = 0; i < 4; i++){********
********cout << int(dbyte[i]) << " ";********
********}********
********cout << endl;********
********return 0;********
********}*
四. 实验结果(包括必要的截图)
1.
四.** 实验结果(包括必要的截图)
1.