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

标签 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               

最佳答案

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 将为零,位于循环 正下方。
  • 您最好将 cld 放在 loop_here 标签之前。
<小时/>
mov     edx,20        
mov     ecx,tang        
mov     ebx,1         
mov     eax,4       
int     0x80      

如果tang被定义为有10字节,那么为什么你要尝试写入20字节?

关于assembly - 如何在nasm汇编语言中从Z循环回到A?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36087899/

相关文章:

linux - assembly ,弹出堆栈到极限

C 从 char 指针一点一点地读取

java - 凯撒密码帮助 ASCII 循环

parsing - 为什么 NASM 在操作数中使用有效指令助记符作为符号名称没有问题?

compiler-construction - 在纯汇编中输出整数的更有效方法

performance - FP 和整数除法是否在 x86 CPU 上竞争相同的吞吐量资源?

c - linux内核bootsect.s文件中的 "seg fs"是什么意思

计算二维网格中的字符数 C

ascii - Visual Works Smalltalk,如何将 Ascii 值转换为字符

汇编 - 在图形模式下打印一个字符