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

时间:2019-02-17 12:23:15

标签: 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

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

0 个答案:

没有答案