繁体   English   中英

Linux中的NASM代码给我带来分段错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM