我通过 RS232 串行端口与硬件连接。这次是无线模块。我决定使用 DOS 作为我的操作系统而不是其他任何东西,因为它是实时的(这意味着没有进程可以中断串行端口的操作)。
我创建了一个关键部分,其中特定字符必须在 QuickBasic 中的某个时间接收,但我想将此部分移植到程序集(机器代码),因此我不必为 QuickBasic 内部处理等待额外的微秒。
这是我的 QuickBasic 代码:
start# = TIMER
DO
IF (TIMER-start#) > .1# THEN
PRINT "failure"
END
END IF
LOOP UNTIL INP(&H3F8) = &H5A
PRINT "SUCCESS"
现在我想将它移植到一个程序集片段中,我可以在 QuickBasic 中应用调用绝对命令,但我不知道我正在使用的代码是否可以工作。(我在这里使用 si 寄存器可以接受吗?)。我希望汇编代码在超时时返回 1,如果在串行线路上接收到正确的字符,则返回 0。
到目前为止,我想出了以下代码(基于 Ralf Brown 的中断列表的帮助):
push bp 'save pointer
mov bp,sp 'get copy
mov ah,00
int 1A 'get bios time
mov si,cx
mainloop:
mov ah,00
int 1A
mov ax,cx
sub ax,si
sub ax,03 'use a 3 tick timeout
jc timeout
mov dx,03F8
in dx,al
cmp al,5A
jne notfound
mov ax,0 'return 0 for got character
jmp ending
notfound:
jmp mainloop
timeout:
mov ax,1 'return 1 for timeout
ending:
mov bx,[bp+06]
mov [bx],ax
pop bp
retf 2
我在钉这个吗?还是我需要做出改变?