代码描述:用80x86汇编,查询输入方式实现,从某输入设备输入128B并存入首地址为BUFFER的内存缓冲区,输入设备的数据口地址是0008H,状态口地址是0020H,状态口的第D0位是读状态位,D0=1表示输入数据有效。
工具介绍:
dosbox 模拟dos环境 masm link 和debug的执行环境工具可在此下载
masm 编译器 asm->obj
link 连接器 obj->exe
debug 调试器
使用方法
在dosbox中将masm link debug的文件夹作为c盘。然后就可以运行masm等程序了。
asm是汇编源程序
obj是编译后的程序
exe是连接后的程序
汇编文件asm结构:
data segment #代码段
xxx
data ends
stack segment #堆栈段
xxx
stack ends
code segment #代码段
main proc far #入口地址
assume CS:code DS:data SS:stack #指定代码段,数据段,堆栈段地址;将数据段的起始地址存到DS寄存器中…
start:
xxx #汇编指令,代码
main endp
code ends
end start
汇编指令详解:
in out 输入输出I/O指令
move lea 转移指令
test 判断指令
jnz 跳转指令 不等于跳转
loop 循环指令
Inc 加1指令
附上代码:
DATASEG SEGMENT
BUFFER DB 128 DUP(?)
DATASEG ENDS
CODE SEGMENT ;
main proc far;
ASSUME CS: CODE, DS: DATASEG
START: MOV AX,DATASEG;
MOV DS, AX;
MOV CX, 128;
lea BX,BUFFER;
LL: MOV DX, 0020H;
LLA: IN AL, DX ;
TEST AL,00000001B ;
JNZ LLA ;
MOV DX, 0008H ;
IN AL, DX ;
MOV [BX],AL ;
INC BX ;
LOOP LL ;
main endp
CODE ENDS
END START
代码分析:
需要在内存区申请128B的内存
在程序开始后,首先将数据段首地址放入ds数据寄存器,将循环次数放入cx寄存器,将内存区首地址放入bx寄存器。
然后,将状态口的地址放入dx寄存器,用in指令从状态口读取数据,判断读数据是否有效,若无效,则跳转接着判断,若有效则去下一步,从数据口读取数据,
从数据口读数据的流程为,首先将数据口的地址赋给dx,然后用in指令从数据口读8个字节的数据,放入寄存器bx指向的地址处([bx]是间接寻址,也就是BUFFER的地址),然后bx加1,接着循环128次。