【问题标题】:print a ascii value in assembly x86 [duplicate]在汇编x86中打印一个ascii值[重复]
【发布时间】:2019-12-17 17:23:27
【问题描述】:

之前有人问过这个问题,但我似乎无法弄清楚:如何在 x86 32 位汇编中打印 ascii 值。

mov eax, 10
add eax, 48
;print contents of eax

【问题讨论】:

  • 显示您的尝试并指定导致您出现问题的原因。也请参阅canonical answers in the x86 tag wiki
  • 在什么操作系统下?您可以使用How do I print an integer in Assembly Level Programming without printf from the c library? 将整数转换为 ASCII 数字字符串,这也显示了使用 Linux 系统调用将该字符串写入标准输出。显然,在任何其他操作系统下,您都可以对数字字符串做任何您想做的事情。
  • 我使用的是 ubuntu 18,它非常简单,但我正在努力让它输出
  • 您要么链接到 libc 并使用 printf 函数,要么编写自己的代码,将整数逐位转换为字符串,然后打印字符串。
  • 查看副本。如果这不能回答您的问题,请告诉我。

标签: assembly ascii


【解决方案1】:

下面是在 32 位 Linux 上使用 printf 的方法:

~/tmp: cat t.s
    .intel_syntax noprefix
    .global main
main:
    mov eax, 10
    add eax, 48
    push eax
    push offset .L1
    call printf
    add esp, 8
    xor eax, eax
    ret
.L1: .asciz "%d\n"
~/tmp: gcc -m32 t.s
~/tmp: a.out
58
~/tmp:

这是在 64 位 Linux 上的操作方法:

~/tmp: cat t.s
    .intel_syntax noprefix
    .global main
main:
    sub rsp, 8
    mov eax, 10
    add eax, 48
    lea rdi, .L1[rip]
    mov esi, eax
    xor eax, eax
    call printf
    add rsp, 8
    xor eax, eax
    ret
.L1: .asciz "%d\n"
~/tmp: gcc t.s
~/tmp: a.out
58
~/tmp:

【讨论】:

  • 请注意,问题确实指定了 32 位模式。
  • @Peter,哎呀。我确实看过,但还是错过了。
【解决方案2】:

这取决于您要如何打印。 你可以...

链接到库中的打印例程。 使用 bios 中断 0x10 打印到屏幕。 使用串行端口打印(如果您正在执行低级编码)。

【讨论】:

  • 如何使用 bios 中断 0x10 打印到屏幕?
  • 首先将整数转换为内存中的字符串。使用 int 0x10 跳转到 bios 中断处理程序。 register ah 包含您要执行的操作的功能码。取决于 cpu 型号(你可能很好)。您可以使用ah中的功能代码0x13将字符串打印到屏幕上。
  • @TomUnsworth:您不能在 32 位模式下使用 int 0x10。这部分答案与您的问题无关。没有独立于操作系统的打印方式。您要么使用系统调用,要么(在裸机上)自己将其写入设备,例如VGA 内存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
  • 2018-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多