NASM(程序集)第二次循环迭代时出现分段错误
NASM (assembly) segmentation fault on 2nd loop iteration
第二次进入循环并输入 E(打算退出循环)时,我一直遇到分段错误。如果我第一次输入 E,它退出就好了。希望我在这里只是愚蠢,有人可以建议一个简单的修复!
感谢您的宝贵时间。
声明:
segment .bss
a resd 1
b resd 1
op resb 2
主要:
loop:
call read_int ;read two integers, then a char
mov [a], eax
call read_int
mov [b], eax
call read_char
call read_char ;takes newline input
cmp al, 'E' ;if char is E, then exit
je exit
call loop ;start over
exit:
dump_regs 0 ;completes, but then seg faults if the loop has run more than once
我看到几个 problems/potential 问题马上就坏了:
1) 当你 "call" 一个子程序时,你通常需要 a) 更新堆栈(在你的子程序中)和 b) 清除堆栈(在你 return 之后)。
您没有向我们展示 "read_int" 或 "read_char",但我怀疑情况可能如此。
2) 差:call loop
。更好:jmp loop
。
您可以在此处找到一些不错的 NASM 示例:http://www.csee.umbc.edu/portal/help/nasm/sample.shtml
第二次进入循环并输入 E(打算退出循环)时,我一直遇到分段错误。如果我第一次输入 E,它退出就好了。希望我在这里只是愚蠢,有人可以建议一个简单的修复!
感谢您的宝贵时间。
声明:
segment .bss
a resd 1
b resd 1
op resb 2
主要:
loop:
call read_int ;read two integers, then a char
mov [a], eax
call read_int
mov [b], eax
call read_char
call read_char ;takes newline input
cmp al, 'E' ;if char is E, then exit
je exit
call loop ;start over
exit:
dump_regs 0 ;completes, but then seg faults if the loop has run more than once
我看到几个 problems/potential 问题马上就坏了:
1) 当你 "call" 一个子程序时,你通常需要 a) 更新堆栈(在你的子程序中)和 b) 清除堆栈(在你 return 之后)。
您没有向我们展示 "read_int" 或 "read_char",但我怀疑情况可能如此。
2) 差:call loop
。更好:jmp loop
。
您可以在此处找到一些不错的 NASM 示例:http://www.csee.umbc.edu/portal/help/nasm/sample.shtml