linux - 如何使用linux中的堆栈从汇编中的ac函数中反转字符串
问题描述
我正在尝试使用汇编堆栈反转从 C 函数获得的字符串。
这是我迄今为止的尝试:
section .text
global do_Str
extern printf
do_Str:
push rbp
mov rbp, rsp
mov rcx, rdi
mov r10, 0
mov r9, 0
;mov r11, 0
;mov r13, 0
label:
cmp byte [rcx], 'a'
jl cont
cmp byte[rcx], 'z'
jg cont
and byte [rcx], 11011111b
cont:
cmp byte[rcx], '('
jne contP
mov byte[rcx], '<'
contP:
cmp byte[rcx], ')'
jne contR
mov byte[rcx], '>'
contR:
cmp byte[rcx],'A'
jl contL
cmp byte[rcx], 'Z'
jg contL
inc r9
contL:
inc r10
inc rcx
cmp byte [rcx], 0
jnz label
; mov r11, rdi
; add r11, r10
; dec r11
; _revrse:
; mov r13 , [r11]
; mov r11 , [rdi]
; mov rdi , [r13]
; shr r10, 00000001
; inc rdi
; dec r11
; cmp r11 , rdi
; jne _revse
done:
mov ecx, r10d
mov eax, esp
mov esi, eax ; esi points to start of string
add eax, ecx
mov edi, eax
dec edi ; edi points to end of string
shr ecx, 1 ; ecx is count (length/2)
jz done ; if string is 0 or 1 characters long, done
reverseLoop:
mov al, [esi] ; load characters
mov bl, [edi]
mov [esi], bl ; and swap
mov [edi], al
inc esi ; adjust pointers
dec edi
dec ecx ; and loop
jnz reverseLoop
sub r10, r9
mov rax, r10
mov rsp, rbp
pop rbp
ret
我不允许添加更多功能。该汇编代码还做了另外两件事:更改两个符号并计算有多少字符不是字母。
我曾尝试使用 rbp 和 rsi,但出现核心转储错误。
解决方案
推荐阅读
- java - Apache Spark - dataset presenting a csv to java.io.File
- python - 为什么 jupyter notebook 运行一个有语法错误的单元格?
- javascript - 后端如何验证前端实际上是真正的前端?
- reactjs - 来自 useEffect 的数据未呈现
- java - 运行 JAVA 应用程序 - 如何在那里管理“受信任的”证书根?
- c - 没有得到调整大小事件
- vba - 使用 VBA 进行网页抓取:强元素的集合
- triggers - SQL Server AFTER INSERT 触发器不起作用,触发器如何工作?
- r - 如何在R中制作剖面图?
- flutter - 添加介绍页面后,按钮无法定向到它以前定向的内容。代码保持不变