我有一个作业,必须输入一个字符串和一个数字,然后通过将该数字添加到其中来返回字符串。我编写了一个程序,但是在 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/