Assembly 如何在汇编代码中执行外部子例程

Assembly 如何在汇编代码中执行外部子例程,assembly,x86-64,Assembly,X86 64,我试图学习如何在外部文件中使用子程序。 所以我有一个名为shift的文件,它接收一个字符串,我试图将每个字符改为“a”。但是,我遇到了一个分割错误。 它将字符串和字符串长度作为参数发送 extern printf, scanf extern shift global _start section .data format3 db "%s ",0 message1: db "1. Input New Message",10,

我试图学习如何在外部文件中使用子程序。 所以我有一个名为shift的文件,它接收一个字符串,我试图将每个字符改为“a”。但是,我遇到了一个分割错误。 它将字符串和字符串长度作为参数发送


extern printf, scanf    
extern shift
global _start

section .data

format3 db "%s ",0      
message1:     db "1. Input New Message",10,0        

original: db "This is the original message.",10,0
    
len1:  equ  $ - original

section .text
        global  main


main:   

    mov rsi, message1
        call messages

    
    mov rdi,[original]
    mov rsi, [len1]
    call shift
    mov [original],rax
    
    mov rsi, original
        call messages
    
    ret

; end main



messages
    mov rdi,format3
    mov rdx,rsi
    mov rax,0
    call printf
    ret

);班次代码:

global shift

section .text

shift:
        mov rax, rdi            ;string to shift                                     
                                         
        mov rdx, rsi            ;rdx length of string                                

        mov rcx,0
loop:   cmp rcx, rdx                                               
        jge done
        mov byte [rax+rcx], 97
        inc rcx
        jmp loop

done:
        ret




您需要无括号的
mov-rdi、原始
mov-rsi、len1
。您的函数不会返回任何内容,因此请删除
mov[original],rax
,这是错误的。PS:您不需要将参数从初始位置移动。PPS:学习使用调试器。