如何在nasm汇编语言中从Z循环回A?

时间:2016-03-18 15:10:24

标签: assembly ascii nasm

我有一个分配,我必须输入一个字符串和一个数字,并通过添加该数字返回字符串。我做了一个程序,但在Z之后它会返回尴尬的值,因为ascii,我想。如何纠正?

这是我的代码 -

section .text
global _start         

_start:                  
mov    ecx, len
mov    esi, bang        
mov    edi, tang

loop_here:
lodsb
add al, 02
stosb
loop    loop_here          
cld
rep     movsb

mov     edx,20        
mov     ecx,tang        
mov     ebx,1         
mov     eax,4       
int     0x80      

mov   edx,len2          
mov   ecx,newline   
mov   ebx,1         
mov   eax,4        
int   0x80          

mov     eax,1       
int     0x80     

section .data
bang db 'password' ;source
len equ $-bang
newline db 0xa
len2 equ $ - newline  

section .bss
tang resb 10               

1 个答案:

答案 0 :(得分:2)

loop_here:
lodsb
add al, 02
stosb
loop    loop_here

当加法产生的结果超出范围[a,z](正好在 z 之上)时,只需通过减去26来校正。

loop_here:
 lodsb
 add   al, 02
 cmp   al, 'z'
 jbe   OK
 sub   al, 26
OK:
 stosb
 loop  loop_here
loop    loop_here          
cld
rep     movsb
  • 执行此操作rep movsb毫无意义,因为此时ECX将在loop正下方为零。
  • 您最好将cld放在 loop_here 标签之前。
mov     edx,20        
mov     ecx,tang        
mov     ebx,1         
mov     eax,4       
int     0x80      

如果 tang 定义为 10 字节,为什么还要尝试写 20 字节?