直接在汇编器中编程 UART

Programming a UART directly in assembler

我正在尝试编写一个汇编函数来读取和回显以下 C 可调用函数的字符

void echo(int comport, unsigned char esc_char) 

基本上它会提示您输入一个 ESC 字符,然后在用户键入一个字符后,它允许您继续键入并在键入该字符时终止程序。我的实现允许用户分配 ESC 字符,但在为之后的任何内容输入第一个字母后停止,我认为这可能是某种无限循环。我该如何解决这个问题?

理想情况下,程序会 运行 像这样

Type escape character and enter
d
abc(d)
Escape character typed - exiting.

但是到目前为止发生的事情是

Type escape character and enter
p
a
(Program Freezes)
.text
.globl _echo
_echo:
    pushl %ebp
    movl %esp, %ebp
    subl , %esp
    movb 12(%ebp), %bl  
    movl 8(%ebp), %edx  

    xorl %ecx, %ecx
    movb [=13=]xfc, %dl
    inb (%dx), %al
    orb [=13=]x03, %al
    outb %al, (%dx)
    movb [=13=]xfe, %dl  
loop1:
    inb (%dx), %al  
    andb [=13=]xb0, %al  
    xorb [=13=]xb0, %al  
    jnz loop1
loop2:
    movl [=13=]xfd, %dl 
    inb (%dx), %al  
    andb [=13=]x01, %al 
    jz loop2        
    movl [=13=]xf8, %dl 
    inb (%dx), %al  
    movb %al, %al   
    cmpb %cl, %bl
    je return
    movb [=13=]xfd, %dl 
type:
    inb (%dx), %al  
    andb [=13=]x20, %al
    jz loop2        
    movzbl %dl, %eax    
    movl [=13=]xf8, %edx    
    outb %al, (%dx) 
    jmp loop2
return:
    mov %ebp, %esp
    popl %ebp
    ret
    .end

从端口读取字符后,你有

    movb %al, %al

应该是

    movb %al, %cl

然后,在检查 THR_EMPTY 之后,您有

    movzbl %dl, %eax

应该是

    movb %cl, %al