assembly - 汇编(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
有几行注释是因为,当我分析教程中的代码时,这些行似乎是多余的(通过运行程序检查它们显然是多余的),但我留下它们以防我真的错了。
解决方案
推荐阅读
- c# - 如何在使用标准用户启动/安装时提升帐户?
- javascript - 反应 onBlur 不影响整个表单元素
- vue.js - 如何使用 JSON Vue/vuex 映射专业化数组
- dictionary - 为什么 Data.Map.Map 不是双函子?
- javascript - Next.js 使用 getServerSideProps 如何将道具从页面传递到组件?
- qt - Qt get path to application for file type
- c# - Unable to display data for jQuery Datatable with server side processing
- bootstrap-4 - bootstrap btn-group not uniform height
- tensorflow - Binary Classification for binary dataset with DNN
- firebase - showDialog() - Attempting to trigger dialog modal based on error message retrieved from Firebase Authentication API call