所以,我想在游戏机上创建一个生活游戏模拟器.为此,我需要向上移动光标,以便我可以在上面重写,我可以使用\u008d来执行此操作.

我在游戏机上试了一下:

echo -e "Everyone\n\u008dHi"

这给出了我的结果:

Hieryone

这是预期的结果,并证明我的控制台接受该字符.但是,当我在NASMtry 完全相同的事情时,

  global _start

  segment .text

_start:
  ;; Print message
  mov   rax, 1
  mov   rdi, 1
  mov   rsi, message
  mov   rdx, length
  syscall

  ;; Exit
  mov   rax, 60
  mov   rdi, 0
  syscall

  segment .data
message: db "Everyone", 0xa, 0x8d, "Hi"
length:  equ $ - message

并像这样运行它,

nasm example.asm -f elf64 -o output.o
ld output.o -o output
./output

我明白了,

Everyone
�Hi

为什么会这样呢?有什么东西改变了我在NASM程序中解释这个字符的方式吗?我是不是在Unicode中遗漏了什么?或者,有没有其他方法可以让我将光标往回移动?任何帮助都是有用的.(我使用的是Linux btw)

推荐答案

我建议你把它和hexdump比一比.

$ echo -e "Everyone\n\u008dHi" | hexdump -C
00000000  45 76 65 72 79 6f 6e 65  0a c2 8d 48 69 0a        |Everyone...Hi.|
0000000e

$ ./output | hexdump -C
00000000  45 76 65 72 79 6f 6e 65  0a 8d 48 69              |Everyone..Hi|
0000000c

如您所见,区别在于您是否拥有0xc2(换行符0x0a除外). 在UTF-8中,0x8d必须表示为0xc2 0x8d.

因此,以下修改将提供预期的结果.

message: db "Everyone", 0xa, 0xc2, 0x8d, "Hi"

Linux相关问答推荐

使用sed替换字符,但如果它是在bash csv文件中的字符串中,则不使用

如何在不使用LD_LIBRARY_PATH或RPATH的情况下运行链接到共享库的二进制文件?

为什么在Linux上STD::SLEEP_FOR(STD::Chrono::Hors::Max())会立即返回?

ShellScript,有更好的方法来查找具有特定名称和日期的文件吗?

Linux 'column' 实用程序的使用

匹配模式和提取

仅查找并保留有效邮箱并删除无效记录,AWK

为什么控制台不接受反向换行?

仅在 Linux 上出现 AWS RDS `flush tables` 错误的 mysqldump

x86_64 Linux 程序集中的逻辑与实现

如何在文本文件中向左移动特定单元格

如何使用 __attribute__((visibility("default")))?

如何在 Linux 命令行上解析 CSV 文件?

/usr/local/bin/ 中Collection的权限被拒绝

错误:命令gcc在 CentOS 上失败,退出状态为 1

隐藏文件 .env 未使用 Docker COPY 复制

如何在 Linux 中为 C 或 C++ 的进程设置 CPU 亲和性?

在 bash 中检测公共 IP 地址的方法

to_string不是std的成员?

cat、grep 和 cut - 翻译成 python