关于在 IA32 的 NASM 程序集中逐字符解析字符串的调试代码
Debug code regarding parsing a string character by character in NASM assembly for IA32
我是汇编的新手 programming.I 偶然发现了一个程序,在这个程序中我需要编写一个代码来从用户那里获取一个字符串和一个数字,并将字符串的每个字符递增给定的数字.
我做了以下事情:-
section .bss
s2 resb 20 ;output string
s1 resb 20 ;input string
num resb 2 ;input number
count resb 1 ;length of the input string
section .data
section .text
global _start
_start:
mov eax,3 ;taking input string from the user
mov ebx,0
mov ecx,s1
mov edx,20
int 0x80
mov eax,3 ;taking input number from user
mov ebx,0
mov ecx,num
mov edx,2
int 0x80
mov al,'1' ;initializing count to 1
sub al,'0'
mov [count],al
mov ecx,20 ;no of times the loop can execute
mov esi,s1 ;to use movsb on s1 and s2
mov edi,s2
mov bl,[num] ;converting string num to integer
sub bl,'0'
loop1: ;parse the string character by character
lodsb
cmp al,00 ;exit out when encounter end_of_file
je _exit
add al,bl
stosb
inc byte [count] ;increament count for every possible character except end_of file
loop loop1
_exit:
cld
rep movsb
mov edx,count
mov ecx,s2
mov ebx,1
mov eax,4
int 0x80
mov eax,1
int 0x80
当我 运行 代码时,它会产生预期的输出和一些乱码。
我无法理解我的代码的问题。
接近尾声:
mov edx,count
这会使用 count
的 地址 加载 edx
寄存器,类似于 0x804912a。你不想写 0x804912a 字节。
您想要 edx
加载 count
的 内容 。请注意,count
是一个字节,但 edx
是一个 32 位寄存器,因此您需要对其进行零扩展。您可能想将该指令替换为
movzx edx, byte [count]
更改后,您的程序按预期运行。
我是汇编的新手 programming.I 偶然发现了一个程序,在这个程序中我需要编写一个代码来从用户那里获取一个字符串和一个数字,并将字符串的每个字符递增给定的数字.
我做了以下事情:-
section .bss
s2 resb 20 ;output string
s1 resb 20 ;input string
num resb 2 ;input number
count resb 1 ;length of the input string
section .data
section .text
global _start
_start:
mov eax,3 ;taking input string from the user
mov ebx,0
mov ecx,s1
mov edx,20
int 0x80
mov eax,3 ;taking input number from user
mov ebx,0
mov ecx,num
mov edx,2
int 0x80
mov al,'1' ;initializing count to 1
sub al,'0'
mov [count],al
mov ecx,20 ;no of times the loop can execute
mov esi,s1 ;to use movsb on s1 and s2
mov edi,s2
mov bl,[num] ;converting string num to integer
sub bl,'0'
loop1: ;parse the string character by character
lodsb
cmp al,00 ;exit out when encounter end_of_file
je _exit
add al,bl
stosb
inc byte [count] ;increament count for every possible character except end_of file
loop loop1
_exit:
cld
rep movsb
mov edx,count
mov ecx,s2
mov ebx,1
mov eax,4
int 0x80
mov eax,1
int 0x80
当我 运行 代码时,它会产生预期的输出和一些乱码。 我无法理解我的代码的问题。
接近尾声:
mov edx,count
这会使用 count
的 地址 加载 edx
寄存器,类似于 0x804912a。你不想写 0x804912a 字节。
您想要 edx
加载 count
的 内容 。请注意,count
是一个字节,但 edx
是一个 32 位寄存器,因此您需要对其进行零扩展。您可能想将该指令替换为
movzx edx, byte [count]
更改后,您的程序按预期运行。