Я новичок, пишу программу на 64-битном языке, которая должна запрашивать у пользователя строку длиной 8 символов и «вырезать» n символов из строки на основе введенного пользователем n (меньше чемили равно 8). Результат не тот, который я ожидаю.
Я пытаюсь изменить адрес строки так, чтобы он указывал на символ, который приходит n символов позже в строке. Я уже пытался использовать rep movsb, но не получилось. Я мог бы использовать петли и прыжки, но я не хочу. Я считаю, что способ, которым я пытаюсь, должен быть достаточно хорошим. Также, используя nasm для этой программы.
section .bss
num: resw 2 ;Reserved for the number of char to be cut off
section .data
str: db "",0x00
strLen: db 8 ; Length of string is 8
section .text
global main
main:
;; Read user input
mov rax,0
mov rdi,0
mov rsi,str
mov rdx,strLen
syscall
;; Get input for int
mov rax,0
mov rdi,0
mov rsi,num
syscall
;; Change the char to number
mov r10,[num]
sub r10,48
mov [num],r10
;; Edit the string address
mov rax,[num]
lea r10,[str+rax]
mov [str],r10
;; Show the edited string
mov rax,1
mov rdi,1
mov rsi,str
syscall
;; Exit section.
mov rax,60 ;calls sys_exit
xor rdi,rdi ;0 for no errors
syscall ;system call
Фактический результат:
Введите строку:
Assembly
Введите количество символовобрезать:
3
Это то, что было введено
Сборка
Вот отредактированный текст
▒J @
Ожидается:
Сборка
3
Сборка
Эмбли