1

我通过 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

我在钉这个吗?还是我需要做出改变?

4

0 回答 0