彩色字符串以相反的顺序打印而不是向前

Posted

技术标签:

【中文标题】彩色字符串以相反的顺序打印而不是向前【英文标题】:Colored string is printing in reverse order not forward 【发布时间】:2022-01-17 07:51:04 【问题描述】:

在汇编语言中,我想以正序打印彩色字符串"-- WELCOME TO E-VOTING MANAGEMENT SYSTEM --",但该字符串以相反的顺序打印。这是output。 以下是我的代码:

;print screen
mov cx,45
mov si,-1
c1:
inc si
mov al,msg3[si]
mov ah,9
mov bh,0
mov bl,00110100b
int 10h
loop c1

【问题讨论】:

效果不错:) int10/9 函数不移动光标。但是,它确实需要在CX 中重复计数。您打印第一个字符 45 次,然后打印第二个字符 44 次,依此类推。这意味着最后的重复仍然可见,因此明显的反转。 【参考方案1】:

此 Bios.WriteCharacterWithAttribute 函数 09h 不会使光标前进。为此,您可以使用 BIOS.Teletype 函数 0Eh。

由于 BIOS.WriteCharacterWithAttribute 函数 09h 使用 CX 寄存器作为重复计数,因此最好不要将 CX 用于循环计数器。下面的代码使用DI。此代码还避免使用因速度慢而臭名昭著的LOOP 指令!见Why is LOOP so slow?。

;print screen
  mov  di, 45
  mov  si, -1
  mov  cx, 1       ; Repetition count
  mov  bx, 0034h   ; DisplayPage 0, Color RedOnCyan
TheLoop:
  inc  si
  mov  al, msg3[si]
  mov  ah, 09h
  int  10h
  mov  ah, 0Eh
  int  10h
  dec  di
  jnz  TheLoop

可以使用偏移量SI 来处理字符作为循环计数器。在一个有 45 个字符的字符串中,最后一个字符的偏移量为 44,所以这是我们在循环退出时需要达到的值:

;print screen
  mov  si, -1
  mov  cx, 1       ; Repetition count
  mov  bx, 0034h   ; DisplayPage 0, Color RedOnCyan
TheLoop:
  inc  si
  mov  al, msg3[si]
  mov  ah, 09h
  int  10h
  mov  ah, 0Eh
  int  10h
  cmp  si, 44
  jne  TheLoop

进一步的改进是使用 xor si, si 的一字节短编码,将偏移量 SI 从 0 开始。这会影响我们检查循环退出的方式!

;print screen
  xor  si, si
  mov  cx, 1       ; Repetition count
  mov  bx, 0034h   ; DisplayPage 0, Color RedOnCyan
TheLoop:
  mov  al, msg3[si]
  mov  ah, 09h
  int  10h
  mov  ah, 0Eh
  int  10h
  inc  si
  cmp  si, 45
  jb   TheLoop

除了使用固定的字符串长度计数,您还可以轻松地使用像零这样的字符串终止符。

;print screen
  xor  si, si
  mov  cx, 1       ; Repetition count
  mov  bx, 0034h   ; DisplayPage 0, Color RedOnCyan
TheLoop:
  mov  al, msg3[si]
  test al, al
  jz   Done
  mov  ah, 09h
  int  10h
  mov  ah, 0Eh
  int  10h
  inc  si
  jmp  TheLoop
Done:

  ...

msg3 db "--  WELCOME TO E-VOTING MANAGEMENT SYSTEM  --", 0

【讨论】:

您已经有 SI 作为循环计数器,您可以只使用cmp si, 45cmp si,di 而不是同时倒计时另一个寄存器。

以上是关于彩色字符串以相反的顺序打印而不是向前的主要内容,如果未能解决你的问题,请参考以下文章

c语言练习27——递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。

如何以相反的字节顺序打印变量?

为啥 termcolor 在 Windows 控制台中输出控制字符而不是彩色文本?

反向字符串打印方法

python 练习 2

为啥这两个变量之一以相反的顺序打印到文件中?