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

3

我有一个任务,需要输入一个字符串和一个数字,然后通过将该数字添加到字符串中返回字符串。我已经编写了一个程序,但是在字母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               

2
你遇到了什么问题?是在思考算法还是实现它时出了问题? - Jester
你可以使用resb len+1代替resb 10,这样它的长度总是与bang+newline相同。或者只使用len,因为似乎你将换行符与字符串分开了?哦,这样就不会被修改了。 - Peter Cordes
哦,谢谢。假设我将bang改为"wxyz",那么它将返回"yz{|",但我想要它返回"yzab"。怎么做? - user158083
如果结果大于'z',则减去26('z'+1-'a')。 - Michael
1个回答

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
  • 既然在loop下面ECX将为零,因此执行rep movsb没有意义。
  • 最好将cld放在标签loop_here之前。
mov     edx,20        
mov     ecx,tang        
mov     ebx,1         
mov     eax,4       
int     0x80      
如果定义了tang为有10个字节,那么你为什么要尝试写入20个字节呢?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接