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字节?
我有一个作业,我必须输入一个字符串和一个数字,然后将 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字节?