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

How to loop back from Z to A in nasm assembly language?

我有一个作业,我必须输入一个字符串和一个数字,然后将 return 字符串与该数字相加。我已经制作了一个程序,但是在 Z 之后它 returns 尴尬的值,我猜是因为 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               
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字节?