[英]NASM Code In Linux Gives Me Segmentation Fault
我开始学习如何使用NASM汇编编程语言编写程序。 我编写了这个简单的程序,提示用户输入两个数字,然后将两个操作数相加。 我编译它时没有任何错误或警告,但是当它提示用户输入两个数字并开始将两个数字相加时,它会打印出分段错误并结束程序。 我知道分段错误等效于Win32世界中的访问读取/写入冲突异常。 但是,因为我不知道如何调试NASM代码; 我不知道怎么了。 我怀疑这与无效的指针有关。 但我不知道 这是下面的代码:
section .data
msg1: db 'Please Enter A Number: ', 0
length1: equ $ - msg1
msg2: db 'Please Enter A Second Number: ', 0
length2: equ $ - msg2
section .bss
operand1: resb 255
operand2: resb 255
answer: resb 255
section .text
global _start
_start:
; Print first message
mov eax, 4
mov ebx, 1
mov ecx, msg1
mov edx, length1
int 80h
; Now read value
mov eax, 3
mov ebx, 1
mov ecx, operand1
mov edx, 255
int 80h
; Print second message
mov eax, 4
mov ebx, 1
mov ecx, msg2
mov edx, length2
int 80h
; Now read second value
mov eax, 3
mov ebx, 1
mov ecx, operand2
mov edx, 255
int 80h
; Now add operand1 and operand2 and print answer
mov eax, 4
mov ebx, 1
xor ecx, ecx ; Make the ecx register 0
mov ecx, operand1
add ecx, operand2
mov edx, 510
int 80h
(此外:您应该从STDIN_FILENO = 0
读取,而不是从STDOUT_FILENO = 1
读取。此外,您正在写入NUL
字符,但不应这样做。)
问题在于操作operand1
和操作operand2
是存放已读取字符的内存位置的地址。 添加它们时,您将获得指向无效内存的指针。
您必须先将它们转换为整数,添加它们,然后再转换回字符串,然后才能将其写出。
ecx中的value是调用int 80h时要打印的字符串的地址。 最后一部分没有意义
mov eax, 4
mov ebx, 1
xor ecx, ecx ; Make the ecx register 0
mov ecx, operand1
add ecx, operand2 ; **<<< invalid memory address now in ECX !!!**
mov edx, 510
int 80h
因为要添加字符串操作数1的地址和字符串操作数2的地址,并尝试打印任何位于ant结果地址的内容,而该地址很可能指向无处。
要使用gdb调试程序,您可以执行以下操作:
nasm -f elf64 -g -l q1.lst q1.asm gcc -o q1 q1.o
我将“ _start”替换为“ main”,以便gcc不会抱怨,如果您在32位平台上构建,则可以跳过“ -f elf64”中的64。
gdb q1
这是gdb会话的示例:
(gdb)在0x4004d0处的主断点1:文件q1.asm,第20行。(gdb)r启动程序:/ home / anonymous / Projects / asm / q1
Breakpoint 1, main () at q1.asm:20
20 mov eax, 4
(gdb) n
21 mov ebx, 1
(gdb) n
22 mov ecx, msg1
(gdb) n
23 mov edx, length1
(gdb) p msg1
$1 = 1634036816
(gdb)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.