我开始学习如何使用 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
是保存您已读取的字符的内存位置的地址。当你添加它们时,你会得到一个指向无效内存的指针。
您必须将它们转换为整数,将它们相加,然后转换回字符串,然后才能将其写出。
关于linux - Linux 中的 NASM 代码出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4980445/