直接在汇编器中编程 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
我正在尝试编写一个汇编函数来读取和回显以下 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