所以我是汇编的初学者,我目前正在阅读有关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
有几行注释行,因为当我分析本教程中的代码时,这些行似乎是多余的(并且通过运行程序来检查它们显然是多余的),但我还是留给我以防万一错误。