问题描述
我使用 X86 创建了一个 rot13 程序,
.intel_Syntax noprefix
.data
.text
.global main
# Program starts here
main:
# first argument
mov r14,[rsi + 8]
# second argument
mov r15,[rsi + 16]
# move the pointer in r15 to r13
mov r13,r15
#empty register
mov r12,0
#counter
mov r11,0
#spot negative
mov rbx,0
jmp .num_check
.num_loop:
sub r15,'0'
#r12 have value Now
mov r12,r15
add r13,1
#update counter
add r11,1
.num_check:
movzx r15,byte ptr [r13]
cmp r15,'-'
je .neg_sign
cmp r15,0
je .single_digit
cmp r11,1
je .double_digit
cmp r15,0
jne .num_loop
.neg_sign:
mov rbx,1
jmp .num_check
.config_neg:
neg r12
mov r15,r12
mov r13,r14
jmp .rotate_char
.single_digit:
#spot negative sign
cmp rbx,'-'
je .config_neg
mov r15,r14
jmp .rotate_char
.double_digit:
sub r15,'0'
mov rax,10
imul rax,r12
mov r12,rax
#r15 is Now int and not char
add r12,r15
cmp rbx,r14
jmp .rotate_char
.char_loop:
add r14,r15
#check if is over 'z'
cmp r14,'z'
jg .over_z
#check if is under 'a'
cmp r14,'a'
jl .under_a
mov rdi,r14
call putchar@plt
add r13,1
jmp .rotate_char
.under_a:
add r14,26
mov rdi,1
jmp .rotate_char
.over_z:
sub r14,1
jmp .rotate_char
.rotate_char:
movzx r14,byte ptr [r13]
cmp r14,0
jne .char_loop
mov rdi,'\n'
call putchar@plt
ret
这个程序的'makefile'
BIN = rotx
all:
gcc -g -O0 $(BIN).s -o $(BIN)
输入输出
对于这个程序,我使用了
movzx r14,byte ptr [r13]
call putchar@plt
输出单个旋转字符。
不是一次输出一个字符,我可以知道如何将旋转后的字符放回到同一个内存中并立即输出吗? (原地旋转)
我知道我可以通过使用将它放回同一个内存
mov byte ptr [r13],r14b
但程序似乎不起作用。
我的尝试
.intel_Syntax noprefix
.data
.text
.global main
# Program starts here
main:
# first argument
mov r14,[rsi + 16]
# Convert char to num
# move the pointer in r15 to r13
mov r13,'a'
jl .under_a
mov byte ptr [r13],r14b
add r13,26
mov byte ptr [r13],r13
call putchar@plt
mov rdi,'\n'
call putchar@plt
ret
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)