我使用的是64位汇编语言,有两个不同的文件。其中一个文件修改了字符串,使字符串中添加了随机的新字符。另一个文件包含一个数组。
这是来自编辑字符串的文件:
returnString:
mov rax, newString
ret
字符串
这是数组以及它是如何设置的:
section .bss
array: resq 4
allocString: resb 128
section .text
_start:
mov qword[array], defaultMes0
xor r8,r8
add r8, 8
mov qword[array + r8], defaultMes1
add r8, 8
mov qword[array + r8], defaultMes2
add r8, 8
mov qword[array + r8], defaultMes3
add r8, 8
型
这是一个将字符串从函数中移到数组中的函数:
rev:
mov rax, 8
movzx rdx, byte [index] ; Clear rdx to avoid issues with imul
imul rdx ; Multiply index by 8
mov rdi, qword [array + rax]
call stringEdit
lea rbx, [allocString]
translateLoop:
mov dl, [rax]
mov [rbx], dl
;both incremented and counter also incremented
inc rax
inc rbx
;comparison, if less than bl then done until it is equal to enterNum (place of split)
cmp byte[rax], 0x0
jne translateLoop
mov rax, 8
movzx rdx, byte [index] ; Clear rdx again
imul rdx ; Multiply index by 8
mov qword [array + rax], rbx
型
如果你使用print函数输出字符串,它将是空的(例如,它将不输出任何东西)。
我试过做:
returnString:
mov rax, [newString]
ret
型
我也试过直接把函数的输出放到字符串中,就像下面这样,但这也不起作用(无论是newString被引用还是被解引用)。如果newString被解引用,这将导致在打印时出现seg错误,如果没有引用,任何其他时候调用函数,数组中的所有内容都指向同一个东西,因此,任何调用此函数的数组索引将共享相同的结果。
call stringEdit
mov qword [array + rax], rdi ;;moved it to the rdi before
型
1条答案
按热度按时间rdrgkggo1#
我试过
字符串
这将返回新字符串内容的前8个字节。您的第一次尝试是正确的,
mov rax, newString
返回了新字符串的地址。型
can't move a 64-bit immediate to memory和R8的使用过于复杂,因为可以更容易地使用
+8
、+16
和+24
进行偏移。型
Info about RIP relative addressing的一个。
型
对于基于 index 变量[0,3]的阅读操作,最好使用缩放索引寻址模式,而不是单独乘以8:
的字符串
这里有一些错误:
型
如果使用print函数输出字符串,则它将为空(例如,它将不输出任何内容)。
(*)是当地址指向字符串后面时所期望的值。