首页 > 解决方案 > 汇编(NASM)中关于打印(多位整数)的困惑

问题描述

所以我是一个汇编初学者,我目前正在学习一些关于 YT 的教程,现在我正在学习一个应该打印整数的练习。现在,我了解了所有这些代码背后的算法,或者更准确地说,了解了它实际打印该整数的过程。问题是,我不确定这是否正是我想象的代码。

例如,给我 digitSp,它将保存整数,以及应该充当一种索引的 digitSpPos。然后我将整数移入 RAX 并调用 _printRAX。到目前为止,对我来说似乎很清楚。当我进入 _printRAX 标签时,混乱就开始了:据我所知,我在 RCX 指向的地址处添加换行值,然后我们增加 RCX 中的值,最后我们将该值传输到数字SpPos。所有这些都非常令人困惑,因为我不知道它应该如何工作:我的目标是以某种方式添加换行并增加“索引”,然后将更新的索引传递给 digitSpPos。但事情是这样发生的吗?例如,当我这样做时,我只是将 100 个字节传输到 rcx,所以当我这样做时,我应该得到 101?当我这样做时,

在接下来的两个循环中,令人困惑的部分只是在我基本上做与 _printRAX 中相同的事情(我更新我的“索引”并一一移动数字)的部分。总而言之,整个想法是将整数除以 10,然后取每个余数并将其粘贴到 RCX 中,直到我重新创建数字,但反过来。然后,我打印从 RCX 结尾到开头的所有内容(以正确的顺序给我整数,加上换行符)。

但问题是,如果 RCX 要保存整个整数,我为什么要使用 digitSp?为什么我将每个数字作为值传递到 RCX 指向的地址中?与寄存器如何查看分配给它们的字节有关吗?

如果我的问题有点奇怪,我深表歉意,但我真的很想了解一切是如何运作的,因为作为初学者,这将帮助我更好地掌握汇编编程背后的想法。我通常会分析每个程序并尝试从中理解,但现在显然我遇到了一些问题。

代码如下:

section .bss
 digitSp resb 100
 digitSpPos resb 8

section .text
 global _start

_start:
 mov rax, 12345
 call _printRAX

 mov rax, 60
 mov rdi, 0
 syscall

_printRAX:
 mov rcx, digitSp
 mov rbx, 10
 mov [rcx], rbx
 inc rcx
 mov [digitSpPos], rcx

_printRAXLoop:
 mov rdx, 0
 mov rbx, 10
 div rbx
 ;push rax
 add rdx, 48

 ;mov rcx, [digitSpPos]
 mov [rcx], dl
 inc rcx
 mov [digitSpPos], rcx

 ;pop rax
 cmp rax, 0
 jne _printRAXLoop

_printRAXLoop2:
 ;mov rcx, [digitSpPos]

 mov rax, 1
 mov rdi, 1
 mov rsi, rcx
 mov rdx, 1
 syscall

 mov rcx, [digitSpPos]
 dec rcx
 mov [digitSpPos], rcx

 cmp rcx, digitSp
 jge _printRAXLoop2

 ret

有几行注释是因为,当我分析教程中的代码时,这些行似乎是多余的(通过运行程序检查它们显然是多余的),但我留下它们以防我真的错了。

标签: assemblynasm

解决方案


推荐阅读