本程序是使用汇编语言通过BISO中断来实现多机间串口通讯功能,程序的简要功能有,支持串口号、波特率、奇偶检验、数据位等通讯参数的设置,可以实现两台PC机间的一发一收的功能;
本人刚学的汇编,写的不好(有点像C的风格),还望各位批评指正。
DATAS SEGMENT ;此处输入数据段代码 str5 db 0dh,0ah,'Enter your choice:','$' strerro db 0dh,0ah,'Your choice is erro! please enter a correct choice!','$' Str0 db 0dh,0ah,'Please input the number of the com:','$' Str1 db 0dh,0ah,'Please input the baud rate:','$' Str2 db 0dh,0ah,'Please input the data bits:','$' Str3 db 0dh,0ah,'Please input the stop bit:','$' Str4 db 0dh,0ah,'Please input the parity bit:','$' Str6 db 0dh,0ah,'Press anykey to send to the other computer:','$' choice0 db '1.com1 2.com2 3.com3','$' choice1 db '1.2400bps 2.4800bps 3.9600bps' ,'$' choice2 db '1.7bits 2.8bits ','$' choice3 db '1.1bit 2.2bits ','$' choice4 db '1.none 2.odd 3.evn','$' sign db 0 ComNum dw 0 ;choice db 2 dup(?) StrEnter db 0dh,0ah,'$' DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX call SetCom call SetBand call SetDaBits call SetSpBit call SetParBit ;初始化串口 mov ah,0 mov al,sign mov dx,ComNum int 14h call SendData jmp exit SetCom proc ;com的菜单, push bx push cx push dx lpcom: lea dx,Str0 mov ah,9 int 21h lea dx,choice0 mov ah,9 int 21h lea dx,str5 mov ah,9 int 21h mov ah,1 int 21h cmp al,'1' je lpcom1 cmp al,'2' je lpcom2 cmp al,'3' je lpcom3 ;cmp al,27 ;;按下ESC则退出 ;je com_exit ;显示错误,提示重新输入 lea dx,Strerro mov ah,9 int 21h ;输入错误,重新输入 jmp lpcom ;将串口设为1 lpcom1: ;mov ah,0;初始化串口1 ;mov dx,0 ;int 14h;调用BISO中断 mov ComNum,0 jmp com_exit ;将串口设为2 lpcom2: ;mov ah,0;初始化串口2 ;mov dx,1 ;int 14h;调用BISO中断 mov ComNum,1 jmp com_exit lpcom3: ;mov ah,0;初始化串口3 ;mov dx,2 ;int 14h;调用BISO中断 mov ComNum,2 com_exit: pop dx pop cx pop bx ret SetCom endp SetBand proc ;band的菜单 push bx push cx push dx lpband: ;mov ah,7 ;int 21h lea dx,Str1 mov ah,9 int 21h lea dx,choice1 mov ah,9 int 21h lea dx,str5 mov ah,9 int 21h mov ah,1 int 21h cmp al,'1' je lpband1 cmp al,'2' je lpband2 cmp al,'3' je lpband3 cmp al,27 ;按下ESC则退出 je band_exit lea dx,Strerro mov ah,9 int 21h ;输入错误,重新输入 jmp lpband lea dx,StrEnter mov ah,9 int 21h ;将串口设为1 lpband1: ;mov ah,0;初始化串口1 ;and al,0a0h;10100000;将波特率设为2400bps ;int 14h;调用BISO中断 and sign,0a0h; jmp band_exit ;将串口设为2 lpband2: ;mov ah,0;初始化串口2 ;and al,0c0h;11000000;将波特率设为4800bps ;int 14h;调用BISO中断 and sign,0c0h jmp band_exit lpband3: ;mov ah,0;初始化串口3 ;mov al,0e0h;11000000;将波特率设为9600bps ;int 14h;调用BISO中断 add sign,0c0h band_exit: pop dx pop cx pop bx ret SetBand endp SetDaBits proc ;com的菜单, push bx push cx push dx lpdata: lea dx,Str2 mov ah,9 int 21h lea dx,choice2 mov ah,9 int 21h lea dx,str5 mov ah,9 int 21h mov ah,1 int 21h cmp al,'1' je lpdata1 cmp al,'2' je lpdata2 cmp al,27 ;按下ESC则退出 je data_exit ;显示错误,提示重新输入 lea dx,Strerro mov ah,9 int 21h ;输入错误,重新输入 jmp lpdata lpdata1: ;mov ah,0;初始化串口1 ;and al,0feh;00000010-f1100,7位数据位 ;or al,02h ;int 14h;调用BISO中断 and sign,0feh or sign,02h jmp data_exit lpdata2: ;mov ah,0;初始化串口2 ;or al,03h;00000011,8位数据位 ;int 14h;调用BISO中断 or sign,03h jmp data_exit data_exit: pop dx pop cx pop bx ret SetDaBits endp SetSpBit proc ;的菜单, push bx push cx push dx lpstop: lea dx,Str3 mov ah,9 int 21h lea dx,choice3 mov ah,9 int 21h lea dx,str5 mov ah,9 int 21h mov ah,1 int 21h cmp al,'1' je lpstop1 cmp al,'2' je lpstop2 cmp al,27 ;按下ESC则退出 je stop_exit ;显示错误,提示重新输入 lea dx,Strerro mov ah,9 int 21h ;输入错误,重新输入 jmp lpstop lpstop1: ;mov ah,0;初始化串口1 ;and al,0fdh;00000010-f1011,第3位设为0 ;int 14h;调用BISO中断 and sign,0fbh; jmp stop_exit lpstop2: ;mov ah,0;初始化串口2 ;or al,02h;00000010-ff,第3位设为1 ;int 14h;调用BISO中断 or sign,04h jmp stop_exit stop_exit: pop dx pop cx pop bx ret SetSpBit endp SetParBit proc ;的菜单, push bx push cx push dx lppar: lea dx,Str4 mov ah,9 int 21h lea dx,choice4 mov ah,9 int 21h lea dx,str5 mov ah,9 int 21h mov ah,1 int 21h cmp al,'1' je lppar1 cmp al,'2' je lppar2 cmp al,'3' je lppar3 cmp al,27 ;按下ESC则退出 je par_exit ;显示错误,提示重新输入 lea dx,Strerro mov ah,9 int 21h ;输入错误,重新输入 jmp lppar lppar1: ;mov ah,0;初始化串口1 ;and al,0f7h;第三位设为0 ;int 14h;调用BISO中断 and sign,0f7h jmp par_exit lppar2: ;mov ah,0;初始化串口2 ;or al,08h;第四位设为1 ;and al,0efh;5设为0 ;int 14h;调用BISO中断 or sign,08h and sign,0efh jmp par_exit lppar3: ;mov ah,0;初始化串口2 ;or al,02h;第4位设为1 ;int 14h;调用BISO中断 or sign,08h or sign,010h par_exit: pop dx pop cx pop bx ret SetParBit endp SendData proc push ax push bx push cx push dx lea dx,Str6 mov ah,9 int 21h lpsend: mov ah,1;从键盘的缓冲区读数据(BISO中断) int 16h jz lpnext mov ah,0;读键盘输入数据(BISO中断) int 16h cmp al,1bh;esc jz send_exit mov ah,1;send data mov dx,ComNum int 14h lpnext: mov ah,3;read com state mov dx,ComNum int 14h loop lpsend mov ah,2;read from com mov dx,ComNum int 14h and ah,01h cmp ah,1 jne lpsend ;disp mov dl,al mov ah,2 int 21h jmp lpsend send_exit: pop dx pop cx pop bx pop ax ret SendData endp exit: MOV AH,4CH INT 21H CODES ENDS END START