匯編代碼及解釋如下:
1 .MODEL TINY 2 .STACK 100 3 .DATA 4 .CODE 5 start: 6 ; set segment registers: 7 mov bl,0feh ;先將bl通用寄存器的值置為1111 1110(實驗室的實驗箱中電路沒有設置反相器,故設為7個1,1個0) 8 mov dx,273h ;將273h送入地址寄存器dx,根據課本P169中8255A的端口操作表,由於273h中3對應0011,故A1A0=11,對應數據總線->控制寄存器,即為寫入控制字做准備 9 mov al,10000010b ;將1000 0010寫入al通用寄存器中 10 out dx,al ;將1000 0010設為8255A的控制字,根據課本P171中8255A的方式選擇控制字可知D7...D1D0=1...10,故B口輸入C口輸出(以上四行為8255A的初始化程序) 11 go: mov al,0ffh ;初始化al通用寄存器,初始化其值為1111 1111 12 mov dx,272h ;將272h送入地址寄存器dx,根據課本P169中8255A的端口操作表,由於272h中2對應0010,故A1A0=10,對應C口 13 out dx,al ;將al中的數據寫入dx對應端口(即將al中數據寫入C口) 14 mov dx,271h ;將271h送入地址寄存器dx,根據課本P169中8255A的端口操作表,由於271h中1對應0010,故A1A0=01,對應B口 15 in al,dx ;將al中的數據讀入dx對應端口(即將al中數據讀入B口) 16 and al,0fh ;對al寄存器中的8位值進行and(與)運算,只取后4位 17 cmp al,0eh ;cmp比較al中的值和0e,若相等,則zf標志位為1,執行jz指令 18 jz st1 19 cmp al,0dh 20 jz nd1 21 cmp al,0bh 22 jz rd1 23 cmp al,07h 24 jz th1 25 jmp go 26 st1: mov bl,0feh 27 mov dx,272h 28 mov al,00h 29 out dx,al 30 jmp go 31 nd1: mov bl,0feh 32 mov dx,272h 33 mov al,0ffh 34 out dx,al 35 jmp go 36 rd1: mov dx,272h 37 mov al,bl 38 out dx,al 39 rol bl,1 ;rol中的l代表left,rol為循環左移指令,移位后經過ffff次loop再次jmp到go段重新執行,下同 40 mov cx,0ffffh 41 lo1:loop lo1 42 jmp go 43 th1: mov dx,272h 44 mov al,bl 45 out dx,al 46 ror bl,1 47 mov cx,0ffffh 48 lo2:loop lo2 49 jmp go 50 end start