将字符旋转到位 (X86)

问题描述

我使用 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)

输入输出

enter image description here

对于这个程序,我使用了

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

输出

enter image description here

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)