繁体   English   中英

关于在Assembly(NASM)中打印(具有多个数字的整数)的困惑

[英]Confusion about printing (an integer with multiple digits) in Assembly (NASM)

因此,我是汇编语言的初学者,目前正在阅读有关YT的一些教程,现在我正在进行一项应打印整数的练习。 现在,我了解了所有这些代码背后的算法,或更确切地说,了解了它如何实际打印该整数的过程。 问题是,我不确定这是否正是我在代码方面的想象。

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

在以下两个循环中,同样,仅当我基本上执行与_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

之所以有几行评论是因为,当我分析本教程中的代码时,这些行似乎是多余的(并且通过运行程序来检查它们显然是多余的),但是我还是留给他们以防万一我可能是错的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM