assembly - NASM程序集交换函数中两个变量的字符串值
问题描述
我试图相互交换两个相似长字符串的值。但是,我一直在尝试使用的解决方案不起作用。它涉及使用一个局部变量来存储另一个字符串的地址和一个循环来通过它的内存地址将另一个字符串的内容复制到另一个,并使用字符串的长度来遍历它
global _start
global get_strlen
global get_vowel
section .data
NULL equ 0
SYS_EXIT equ 60
string1 db 'hello everyone', NULL
strlen dq 0
section .bss
string2 resb 20
section .text
_start:
mov rdi, string1
mov rsi, strlen
call get_strlen
mov rsi, string1
mov rdi, string2
mov rdx, qword[strlen]
mov rcx, qword[strlen]
call get_vowel
exit_here:
mov rax, SYS_EXIT
xor rdi, rdi
syscall
get_strlen:
len_loop:
mov al, byte[rdi]
cmp al, NULL
je return
inc rdi
inc byte[rsi]
jmp len_loop
return:
ret
get_vowel:
push rbp
mov rbp, rsp
sub rsp, 8
mov rcx, rcx
mov rsi, rsi
mov rdi, rdi
cld
str_loop:
lodsb
stosb
cmp al, 'a'
je vowel_a
cmp al, 'e'
je vowel_e
cmp al, 'i'
je vowel_i
cmp al, 'o'
je vowel_o
cmp al, 'u'
je vowel_u
loop str_loop
mov byte[rdi], NULL
mov al, 0
jmp str_swap
vowel_a:
dec rdi
mov byte[rdi], '@'
inc rdi
jmp str_loop
vowel_e:
dec rdi
mov byte[rdi], '3'
inc rdi
jmp str_loop
vowel_i:
dec rdi
mov byte[rdi], '1'
inc rdi
jmp str_loop
vowel_o:
dec rdi
mov byte[rdi], '0'
inc rdi
jmp str_loop
vowel_u:
dec rdi
mov byte[rdi], 'U'
inc rdi
jmp str_loop
str_swap: ;swaps address of string1 and string2
mov r10, rdi
mov qword[rbp-8], r10
mov r10, rsi
mov rdi, r10
mov r10, qword[rbp-8]
mov rsi, r10
jmp str_copy
str_copy: ;swap string1 and string2 values
mov rcx, rdx
mov rsi, rsi
mov rdi, rdi
cld
loop1:
movsb
loop loop1
mov byte[rdi], NULL
add rsp, 8
pop rbp
ret
结尾总是导致 string2 的值是被操纵的字符串值,并且 string1 的值始终保持不变
解决方案
推荐阅读
- spring-boot - 执行 SQL Builder 类时出现 SQL UNINITIALIZED 错误 - MyBatis Springboot
- bash - 将值从 csv 文件存储到数组 Ubuntu
- jsp - 用于构建对象列表的 JSP EL 表达式
- postgresql - @Tailable(spring-data-reactive-mongodb) 等效于 spring-data-r2dbc
- python - 如何到达并添加新行到在 Django 框架中制作的 Web 服务器数据库?
- excel - excel中是否有sum oa完成的功能?
- javascript - 获取不是基于 jquery 的库 Rails 6 Webpack 的函数错误
- groovy - Spock 单元测试来测试 RestTemplate.postForEntity
- r - 我可以在单个闪亮仪表板模块中包含多个 UI 元素吗?
- c# - 用户控件不显示其内容