在 NASM 中输入大字符串时出错
Error while entering a large string in NASM
- 我在 Linux 上使用 x64 NASM(Ubuntu 20.04,使用 Virtual Box)
- 我也在使用 SASM IDE,它包含内置的 io64 库(显然,这个库有助于控制台 input/output)
- 我为了好玩而解决的任务非常基础:
- 输入的是一个长度<=100的字符串,其中所有字符都是拉丁字母
- 输出是一个字符串“你好,{input}!” (没有括号)
- 这是我的代码
; NASM, x64, Linux, Ubuntu 20.04
%include "io64.inc"
section .text
global main
main:
GET_STRING name, 101 ; reading name
mov rax, 0 ; initializing counter
call input_iter ; processing input
mov byte [output + rax + 7], '!' ; this character is needed by condition
mov byte [output + rax + 8], 0xa
mov rax, 0 ; initializing counter
call output_iter ; giving output
jmp end
input_iter: ; one iteration of input loop
mov byte ch, [name + rax]
mov byte [output + rax + 7], ch ; writing one char from name to output
inc rax
cmp byte [name + rax], 0x0 ; GET_STRING ends string with 0-code char
jne input_iter
ret
output_iter: ; one iteration of output loop
PRINT_CHAR [output + rax] ; char given to out
inc rax
cmp byte [output + rax], 0xa ; if char is NUL, iteration stops
jne output_iter
ret
end: ; just an end of program
section .data
output db 'Hello, ', 0xa ; here will be all output
name db 0xa ; temporary storage for input
- 现在的问题是:
当输入为 16 个字符或更长时,程序将因错误而终止。 15 个或更少的字符都可以。
我不知道为什么!
PS
这是我关于 Whosebug 的第一个问题。我喜欢代码领域,这很有趣
您没有为 input/output 字符串预留足够的临时存储空间。
name db 0xa
只定义了一个字节的空间,并没有用值 0xa
初始化它。该值被 GET_STRING name, 101
中的第一个字母覆盖。
接下来的字母存储在 name
后面的未定义内存中。
为部分 .data
分配的内存被四舍五入,因此可能在 name
字节后面分配了几个字节,并且您的程序意外地适用于短输入字符串。当字符串较长时,它会尝试访问未分配的内存,从而导致分段错误。
从 output
字符串定义中省略 , 0xa
并将 name db 0xa
替换为
name: times 101 db 0x0a
,参见 repeating Data in NASM
您可以打印 output
和 name
作为一个连接字符串。
- 我在 Linux 上使用 x64 NASM(Ubuntu 20.04,使用 Virtual Box)
- 我也在使用 SASM IDE,它包含内置的 io64 库(显然,这个库有助于控制台 input/output)
- 我为了好玩而解决的任务非常基础:
- 输入的是一个长度<=100的字符串,其中所有字符都是拉丁字母
- 输出是一个字符串“你好,{input}!” (没有括号)
- 这是我的代码
; NASM, x64, Linux, Ubuntu 20.04
%include "io64.inc"
section .text
global main
main:
GET_STRING name, 101 ; reading name
mov rax, 0 ; initializing counter
call input_iter ; processing input
mov byte [output + rax + 7], '!' ; this character is needed by condition
mov byte [output + rax + 8], 0xa
mov rax, 0 ; initializing counter
call output_iter ; giving output
jmp end
input_iter: ; one iteration of input loop
mov byte ch, [name + rax]
mov byte [output + rax + 7], ch ; writing one char from name to output
inc rax
cmp byte [name + rax], 0x0 ; GET_STRING ends string with 0-code char
jne input_iter
ret
output_iter: ; one iteration of output loop
PRINT_CHAR [output + rax] ; char given to out
inc rax
cmp byte [output + rax], 0xa ; if char is NUL, iteration stops
jne output_iter
ret
end: ; just an end of program
section .data
output db 'Hello, ', 0xa ; here will be all output
name db 0xa ; temporary storage for input
- 现在的问题是: 当输入为 16 个字符或更长时,程序将因错误而终止。 15 个或更少的字符都可以。 我不知道为什么!
PS 这是我关于 Whosebug 的第一个问题。我喜欢代码领域,这很有趣
您没有为 input/output 字符串预留足够的临时存储空间。
name db 0xa
只定义了一个字节的空间,并没有用值 0xa
初始化它。该值被 GET_STRING name, 101
中的第一个字母覆盖。
接下来的字母存储在 name
后面的未定义内存中。
为部分 .data
分配的内存被四舍五入,因此可能在 name
字节后面分配了几个字节,并且您的程序意外地适用于短输入字符串。当字符串较长时,它会尝试访问未分配的内存,从而导致分段错误。
从 output
字符串定义中省略 , 0xa
并将 name db 0xa
替换为
name: times 101 db 0x0a
,参见 repeating Data in NASM
您可以打印 output
和 name
作为一个连接字符串。