首页 > 解决方案 > 汇编中的移位字符

问题描述

我有一个 ac 函数,它接收一个字符和一个整数作为参数,并使用整数移动该字符。所以假设字符是“a”,整数是 2,它将返回“c”。我需要做的是在汇编中从用户那里获取字符串和班次数。然后调用我的函数并返回加密的单词。因此,如果单词是 Love 并且班次数为 2,则单词将变为 Nqxg。

我做这件事的时候最糟糕。不知道该怎么做我已经尝试了很多东西。

当我跑的时候,第一封信就来了。所以至少有些东西在起作用。我确定是关于尺寸的,我对组装很陌生,但仍在尝试了解寄存器的工作原理。我也不知道如何将我的字符附加到我的字符串中

任何人都可以尝试修复我的轮班子程序吗?谢谢

这就是我所拥有的:

extern printf, scanf
extern encrypt


global _start

section .data
format db '%ld',0
format3 db "%s ",0

message1:     db "1. Input New Message",10,0
message2:     db "Enter a number of shift:",10,0

section .bss
getMessage:     resq 1
shiftNum          resq 1
encrypted          resq 1

len:  equ  $ - getMessage
base: equ getMessage - 4


section .text
        global  main


main:

        mov rdx, message1
        call print

        call scanMessage

        mov rdx, message2
        call print

        call scanChoice

        mov rdx, getMessage
        call print

        mov r8, getMessage
        mov rbx, [shiftNum]
        mov rdx, len
        call shift

        mov rdx, encrypted
        call print

        ret

; end main     

scanChoice:                     ;getting the year from user                                                                                                                                                 
   mov rdi, format
        mov rsi, shiftNum
        mov rax, 0              ;no xmm registers                                                                                                                                                           
        call scanf              ;calling c function to get input from user                                                                                                                                  
        ret

scanMessage:
        mov rax, 0
        mov rdi, 0
        mov rsi, getMessage
        mov rdx, len
        syscall
        ret                                                                    \

print:
        mov rdi,format3
        mov rsi,rdx
        mov rax,0
        call printf
        ret

shift:
        mov rcx, 0
loop:   cmp rcx, rdx            ;comparing string length with rcx                                                                                                                                           
        jge done
        mov rdi, [r8+ rcx*4]
        mov rsi, rbx            ;number of shifts                                                                                                                                                           
        call encrypt
        mov [encrypted+rcx*4], rax ;appending to string                                                                                                                                                     
        inc rcx
        jmp loop
done:
        ret
                

我的输出:

1. Input New Message

Hello

 Enter a number of shift:

 4

Hello

 L

->这就是即将到来的,而不是利普斯,这将是来自 Hello 的每个字母移动 4 次

标签: assemblyx86-64

解决方案


推荐阅读