功能描述:通过编程实现软中断指令INT 80H;当输入参数AH=1,实现一个无符号整数的十进制输入,结果放在AX寄存器;当输入参数AH=2,实现一个无符号整数的十进制显示;使用一主程序测试并验证该软中断指令。编程提示:1.编程实现以上功能; 2.在主程序中首先把以上中断程序(要注意保护现场、恢复现场)入口地址保存到中断向量表,然后才可以调用该软中断指令; ; 中断处理子程序如下定义: SERVICE PROC FAR …… IRET 向量表修改可通过如下指令实现(注“SERVICE”为中断程序名): MOV AX, SEG SERVICE
MOV DS,AX
MOV DX,OFFSET SERVICE
MOV AH,25H
MOV AL,80H
INT 21H
输入10进制数软中断调用方法:
MOV AH,1
INT 80H
MOV BX,AX ;(结果放入BX)
显示10进制数软中断调用方法: MOV AH,2 ;要显示的数在BX
INT 80H
下面是一个使用汇编语言解决此问题的示例代码:
; 定义软中断处理子程序
SERVICE PROC FAR
; 保护现场
push bp
mov bp, sp
; 判断AH的值
cmp ah, 1
jne read_number
; 输入一个无符号整数的十进制值
xor ax, ax
xor dx, dx
mov ah, 0
int 21h
jmp done
read_number:
; 显示一个无符号整数的十进制值
xor ah, ah
int 21h
done:
; 恢复现场
pop bp
iret
SERVICE ENDP
; 主程序
main proc
; 保存软中断处理子程序的入口地址到中断向量表
mov ax, seg SERVICE
mov ds, ax
mov dx, offset SERVICE
mov ah, 25h
mov al, 80h
int 21h
; 输入一个无符号整数的十进制值
mov ah, 1
int 80h
mov bx, ax
; 显示一个无符号整数的十进制值
mov ah, 2
int 80h
; 结束程序
mov ax, 4c00h
int 21h
main endp
end main
在运行上述代码之前,需要使用键盘输入替换 int 21h 语句。
以下是使用汇编语言实现软中断指令 INT 80H 的代码示例:
; 定义中断处理子程序
SERVICE PROC FAR
PUSH AX ; 保护现场
PUSH BX
PUSH CX
PUSH DX
; 根据参数AH的值执行不同的操作
CMP AH, 1
JE INPUT_INT
CMP AH, 2
JE DISPLAY_INT
; 恢复现场
POP DX
POP CX
POP BX
POP AX
IRET
INPUT_INT:
; 实现无符号整数的十进制输入
; 此处省略实现细节
JMP DONE
DISPLAY_INT:
; 实现无符号
以下是一个完整的中断处理子程序的实现示例:
// 中断处理子程序
void __interrupt __far service(void)
{
// 保护现场
_asm {
push ax
push bx
push cx
push dx
push es
}
// 获取参数AH的值
_asm {
mov ah, [bp + 4]
}
// 判断参数AH的值
switch (ah) {
case 1: { // 输入无符号整数
unsigned int num;
scanf("%u", &num);
_asm {
mov ax, num
}
break;
}
case 2: { // 显示无符号整数
_asm {
mov bx, [bp + 6]
}
printf("%u\n", bx);
break;
}
}
// 恢复现场
_asm {
pop es
pop dx
pop cx
pop bx
pop ax
}
// 中断结束
_asm {
iret
}
}