gpt4 book ai didi

assembly - 在 Linux 上以汇编形式输出整数

转载 作者:行者123 更新时间:2023-12-03 09:49:07 25 4
gpt4 key购买 nike

这需要在纯汇编中完成(即没有库或调用 C)。

我理解问题的本质:需要将整数除以 10,将一位余数转换为 ASCII,输出,然后用商重复该过程。

但由于某种原因,它只是不起作用。我在 x86 上使用 NASM。

这是我到目前为止所拥有的(不输出任何内容,但也不抛出任何汇编错误):

; integer to output is stored in eax
mov ecx, 10 ; for base 10

loop:
div ecx ;EAX contains the quotient, EDX the remainder

; Do something to EDX to convert it to ASCII, not sure if this is correct
add edx, '0'

push eax ;We'll be playing with EAX to output EDX, save EAX to the stack

mov eax, 4 ; sys_write
mov ebx, 1 ; to STDOUT
mov ecx, edx
mov edx, 1
int 0x80

pop eax ;restore EAX

cmp eax, 0 ;If EAX is 0, our job is done
jnz loop

有许多与此类似的问题(即 thisthis ),但我在实现中迷失了方向。 This question (对于 DOS)也很有帮助,但我仍然感到困惑。

我一定在这里遗漏了一些东西。想法?

最佳答案

至少还有两个问题。超越腐败ecx @sarnold 提到的:

  • div ecx除以 64 位值 edx:eax来自 ecx ,所以你需要确保你设置了 edx除法前为 0。
  • write 的第二个参数系统调用(在 ecx 中)应该是指向包含要打印的字符的缓冲区的指针,而不是字符本身。

  • 解决第二个问题的一种方法是将包含要打印的字符的寄存器压入堆栈,然后分配堆栈指针 especx (堆栈指针指向最近推送的项目,x86 存储值是小端的,所以第一个字节是低 8 位)。例如
    push edx         ; save value on stack
    mov eax, 4 ; sys_write
    mov ebx, 1 ; to STDOUT
    mov ecx, esp ; first byte on stack
    mov edx, 1 ; length = one byte
    int 0x80
    pop edx ; remove what we pushed (or "add esp, 4" would do just as well here;
    ; we don't need the actual value again)

    这应该足以获得一些输出......

    (但此时,您可能会注意到算法的一个“特征”,并想重新考虑如何存储除法产生的数字!)

    关于assembly - 在 Linux 上以汇编形式输出整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8031831/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com