首页 > 解决方案 > 在用户选择的索引 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”变量。当我运行程序时,它所做的只是崩溃。

标签: assemblyx86-64

解决方案


推荐阅读