我可以帮您翻译成中文。这段内容是关于在汇编语言中调用C函数进行测试时,使用ANSI转义码并调用使用printf的C函数时出现了奇怪的行为。
以下是汇编部分:
当我运行它时,“Hello!”消息全白显示,就好像汇编部分没有打印ansi代码一样。
然后信封上的字母按照我一开始预期的那样,每种颜色各有一个。 这种行为的原因是什么?
以下是汇编部分:
section .data
red db 27,"[31;1m",0
redlen equ $ - red
cyan db 27,"[36;1m",0
cyanlen equ $ - cyan
colorReset db 27,"[0m",0
colorResetLen equ $ - colorReset
section .text
extern printLetter
extern letter
global main
main:
mov BYTE [letter], 'H'
call ansiSetRed
call printLetter
mov BYTE [letter], 'e'
call ansiSetCyan
call printLetter
mov BYTE [letter], 'l'
call ansiReset
call printLetter
mov BYTE [letter], 'l'
call ansiSetRed
call printLetter
mov BYTE [letter], 'o'
call ansiSetCyan
call printLetter
mov BYTE [letter], '!'
call ansiReset
call printLetter
mov BYTE [letter], 10
call printLetter
ret
ansiSetRed:
mov rax, 1
mov rdi, 1
mov rsi, red
mov rdx, redlen
syscall
ret
ansiSetCyan:
mov rax, 1
mov rdi, 1
mov rsi, cyan
mov rdx, cyanlen
syscall
ret
ansiReset:
mov rax, 1
mov rdi, 1
mov rsi, colorReset
mov rdx, colorResetLen
syscall
ret
看起来很长,但它只是在开头定义了一些带有ansi代码的字符串,一个用于设置前景颜色为红色,一个用于青色,另一个用于重置颜色。
然后我有一些函数,使用系统调用write打印这些ansi字符串。
主要函数只是打印“Hello!”交替使用每个字母的颜色,首先调用一个汇编函数打印相应的ansi字符串,然后调用一个外部c函数打印存储在全局变量中的字符。
这里是c部分:
#include <stdio.h>
char letter;
void printLetter(void) {
printf("%c", letter);
}
当我运行它时,“Hello!”消息全白显示,就好像汇编部分没有打印ansi代码一样。
但是,如果我将 c 部分更改为在每个字符后只打印一个新行:
#include <stdio.h>
char letter;
void printLetter(void) {
printf("%c\n", letter);
}
然后信封上的字母按照我一开始预期的那样,每种颜色各有一个。 这种行为的原因是什么?
strace
用于跟踪系统调用,ltrace
用于跟踪库函数调用。 - Peter Cordes