Assembly 在汇编程序中直接编写UART
我正试图编写一个汇编函数来读取和回显以下C可调用函数的字符Assembly 在汇编程序中直接编写UART,assembly,x86,uart,Assembly,X86,Uart,我正试图编写一个汇编函数来读取和回显以下C可调用函数的字符 void echo(int comport, unsigned char esc_char) 基本上,它会提示您输入ESC字符,然后在用户键入一个字符后,它允许您继续键入,并在键入该字符时终止程序。我的实现允许用户分配ESC字符,但在键入第一个字母之后,就会停止,我相信这可能是某种无限循环。我如何着手解决这个问题 理想情况下,程序会这样运行 但到目前为止发生的是 从端口读取字符后,您有 movb %al, %al
void echo(int comport, unsigned char esc_char)
基本上,它会提示您输入ESC字符,然后在用户键入一个字符后,它允许您继续键入,并在键入该字符时终止程序。我的实现允许用户分配ESC字符,但在键入第一个字母之后,就会停止,我相信这可能是某种无限循环。我如何着手解决这个问题
理想情况下,程序会这样运行
但到目前为止发生的是
从端口读取字符后,您有
movb %al, %al
movzbl %dl, %eax
应该是
movb %al, %cl
movb %cl, %al
然后,在检查thru EMPTY之后,您有
movb %al, %al
movzbl %dl, %eax
应该是
movb %al, %cl
movb %cl, %al
注释您的代码,特别是如果您希望其他人提供帮助。此外,使用调试器单步执行程序,并亲自查看出错的地方。最后,考虑是否需要为此进行组装。通常你只有
in
/out
作为程序集,其余的是C。PS:按照通常的调用约定ebx
是被调用方保存的寄存器。是的,我确定这是第一个movb$0xfc,%dl
应该以al
为目标的寄存器?dx
已由参数中的movl 8(%ebp),%edx
加载。。。您是否至少进行了一些基本调试以消除明显的问题?然后,您应该对代码进行注释,以明确双重加载edx
不是错误,而是意图。(我没有进一步阅读代码,因为ebx
+奇怪的代码已经足够开始了)。感觉像是新编写的代码,根本没有任何调试工作,这不值得评论,因为每隔一行可能会有几个错误。@Ped7g,此函数旨在使用等于0x3f8或0x2f8的第一个参数调用。每个com端口由8个连续的I/O端口组成。在每个端口访问之前加载dl,以指定访问8个端口中的哪一个。最好先执行mov8(%ebp),%edi
,然后执行leaxx(%edi),%edx
为每个端口设置dx。有了这个更改,这段代码将与任何com端口地址一起工作。