[英]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.