linux - Linux 中的 NASM 代码出现段错误

标签 linux ubuntu segmentation-fault nasm

我开始学习如何使用 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 字符,但不应该。)

问题是 operand1operand2 是保存您已读取的字符的内存位置的地址。当你添加它们时,你会得到一个指向无效内存的指针。

您必须将它们转换为整数,将它们相加,然后转换回字符串,然后才能将其写出。

关于linux - Linux 中的 NASM 代码出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4980445/

相关文章:

swift - Ubuntu 14.04 中出现 "swift build"错误

linux - 设置 bind9 DNS 正向查找

C 程序以 -1 (0xFFFFFFFF) 终止,似乎没有任何原因?

c++ - 您如何阅读 segfault 内核日志消息

linux - 删除第一个冒号和第一个制表符之间的所有内容

linux - 使用 bash 脚本遍历包含域的文本文件

ubuntu - 使用 docker 在 Ubuntu 上安装最新版本的 Mono

c++ - argv[1] 给出段错误

regex - 从压缩文件中提取正则表达式

c - windows上的代码文件如何与WSL/linux同步?