【问题标题】:How to loop back from Z to A in nasm assembly language?如何在 nasm 汇编语言中从 Z 循环回 A?
【发布时间】:2016-07-05 09:58:13
【问题描述】:

我有一个任务,我必须输入一个字符串和一个数字,然后通过添加该数字来返回字符串。我已经制作了一个程序,但是在 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               

【问题讨论】:

  • 是什么导致了您的问题?考虑算法还是实现它?
  • 您可以使用resb len+1 而不是resb 10,因此它的长度始终与bang+newline 相同。或者只是len,因为您似乎将换行符与字符串分开?哦,所以它不会被修改。
  • 哦,谢谢。假设我将 bang 更改为“wxyz”,那么它将返回“yz{|” ,但我希望它返回“yzab”。该怎么做?
  • 如果结果 > 'z',减去 26 ('z'+1-'a')。

标签: assembly ascii nasm


【解决方案1】:
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 个字节?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多