微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将字符旋转到位 (X86)

如何解决将字符旋转到位 (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 举报,一经查实,本站将立刻删除。