assembly - 在用户选择的索引 x86_64 处打印一个字符
问题描述
extern printf
extern scanf
section .data
inputnumber db "%ld", 0
inputstring db "%s", 0 ,0
outputnumber db "%ld, ", 0
outputstring db "%s", 0 ,0
section .bss
number resq 1
string resb 124
counter resq 1
print resb 12
section .text
global main
main:
mov rbp, rsp; for correct debugging
push rbp
mov rax, 0
mov rdi, inputnumber
mov rsi, number
call scanf
mov rax, 0
mov rdi, inputstring
mov rsi, string
call scanf
mov rdi, number
mov rsi, string
mov rbp, print
mov dword [counter], 1
call index
mov rax, 0
mov rdi, outputnumber
mov rsi, [number]
call printf
mov rax, 0
mov rdi, outputstring
mov rsi, rbp
call printf
pop rbp
ret
index:
.counterInc:
lodsb
cmp rdi, [counter]
je .correctIndex
inc dword [counter]
jmp .counterInc
.correctIndex:
mov byte [rbp-1], dl
stosb
ret
我决定练习一些汇编,以更深入地了解编程语言在低级别是如何工作的。我做了一些简单的添加程序和打印输出,我看到了在用户输入的选定位置打印单个字符的想法。我使用 C 函数(scanf、printf)来获取用户输入并打印出来。我写的背后的逻辑是,函数 .counterInc 增加计数器,直到它达到与我们选择的索引相同的值,而在这种情况发生时,我调用函数 lodsb,如果我理解正确,它每次循环和存储时将 RSI 递增 1 AL 中的当前字符。当它达到与用户输入相同的值时,它会跳转到 .correctIndex,我们将 char 从 al 移动到“print”变量。当我运行程序时,它所做的只是崩溃。
解决方案
推荐阅读
- python - 如何在python中删除json文件中的键/值对
- rest - 是否有任何工具可以从 JSON 或 Open API 自动创建类似 wiki 的 REST API 文档?
- opencv - 有没有办法在 OpenCV 中跟踪预先检测到的对象
- wait - Freemarker 中是否有“等待 x 秒”命令?
- python - 在启动时为树莓派加载 GUI Python 脚本
- python - Spacy NER:根据值列表识别命名实体
- php - 未定义的函数/方法 - Intelephense(1013) - Laravel Homestead + VScode
- php - 调用端点失败返回字符串(69)“错误:此方法仅支持 xml ExceptionType:System.Exception”
- c# - 使用 Google 搜索精选片段网址结果中的 Html 敏捷包屏幕抓取文本
- python - 用户输入特定值,不完全退出程序