直接在汇编程序

时间:2017-11-17 18:17:14

标签: assembly x86 uart

我正在尝试编写汇编程序函数来读取和回显以下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 $8, %esp
    movb 12(%ebp), %bl  
    movl 8(%ebp), %edx  

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

1 个答案:

答案 0 :(得分:1)

从端口读取字符后,您有

    movb %al, %al

应该是

    movb %al, %cl

然后,在检查THR_EMPTY后,你有

    movzbl %dl, %eax

应该是

    movb %cl, %al