关于8255A的小问题
下面这个程序是从a口输入数据,取反后从b口输出,可是中间为什么要用那些nop呢?
请指教
data segment para
innum db ?
outnum db ?
data ends
stack segment para stack
db 100h dup(?)
stack ends
code segment
main proc far
assume cs:code,ds:data,ss:stack
org 100h
start:
mov ax,data
mov ds,ax
mov dx,306h
mov al,10010000b
out dx,al
nop //?
mov dx,300h
in al,dx
mov innum,al
mov al,innum
xor al,0ffh
mov outnum,al
mov dx,302h
nop //?
nop //?
out dx,al
mov ax,4c00h
int 21h
main endp
code ends
end start
推荐阅读
13b5:0100 b8b513 mov ax,13b5
13b5:0103 8ed8 mov ds,ax
13b5:0105 90 nop
13b5:0106 ba0603 mov dx,0306
13b5:0109 b090 mov al,90
13b5:010b ee out dx,al
13b5:010c 90 nop
13b5:010d ba0003 mov dx,0300
13b5:0110 ec in al,dx
13b5:0111 a2fe00 mov [00fe],al
13b5:0114 a0fe00 mov al,[00fe]
13b5:0117 34ff xor al,ff
13b5:0119 a2ff00 mov [00ff],al
13b5:011c ba0203 mov dx,0302
13b5:011f 90 nop
13b5:0120 90 nop
13b5:0121 ee out dx,al
13b5:0122 b8004c mov ax,4c00
13b5:0125 cd21 int 21
看这样的代码也没有觉得有什么,开始以为是要按照 word 对齐,可惜不是。
不清楚你的代码从哪里得到的。。。
不一定要用吧。
不知你试了没?
nop占用一个cpu周期,这样就可以让外设有时间作出反应。
楼上说的对
mov dx,302h要用二个周期才能完成或可靠完成
端口准备好了
out dx,al
硬件要用一定的时间才能完成可靠的传送
一般在端口写上用的较多,而且是二次命令


讨论区