汇编语言实验端口和中断调用
一、实验目的能够通过端口访问外设信息能够通过中断调用进行输入输出实验内容过程记录任务1计算机电子琴程序——编写程序程序运行时使PC机成为一架可弹奏的电子琴当按下数字键1-8时依次发出8个音调按ESC则退出程序。程序设计思路对于第一部分提前存好音符的频率数据。用DOS功能等待键盘按键按ESC直接退出程序只识别数字1-8把按键数字转成数组里的位置然后发声。第二部分分三组存放低、中、高三套音符频率。改用BIOS键盘读取靠扫描码识别按键不受字母ASCII乱序影响。第三部分在拓展1代码基础上加一个标记变量记录当前音调档位。按下数字1/2/3修改标记分别对应低/中/高音三套音符。源程序assume cs:codesegdata segmentdw 262,294,330,349,392,440,494,524codeseg segmentstart: mov ax, datamov ds, axmov si,0play:mov ah,1int 21h;使用的dos输入所以al存的ascii码cmp al,1bhje overcmp al,8ja playcmp al,1jb playsub al,30h;把ascii码转换成数字dec al;减一从0开始mov bl,2;占两个mul bl;×2mov si,axmov al,0b6h ;8253芯片初始化out 43h,al ;43H是8253芯片控制口的端口地址mov dx,12hmov ax,34dchdiv word ptr [si] ;除以数据区中的数值以获得声音的频率值out 42h, almov al, ahout 42h, al ;分两次向42H端口输出1个字用于设置频率in al, 61h ;读设备控制器端口原值mov ah, al ;保存原值or al, 3 ;打开扬声器和定时器out 61h, al ;接通扬声器发声mov dx, 10 ;延时delay0: mov cx, 30000delay1:noploop delay1dec dxjne delay0mov al, ah ;恢复端口原值out 61h, aljmp playover:mov ax, 4c00hint 21hcodeseg endsend start遇到的问题一开始用ASCII判断字母按键识别不全后来换成扫描码了就能正常识别。跳转距离过长编译报错拆分跳转语句解决越界问题