x86汇编操作数组存储逐字符读取的输入时出现段错误问题求助
问题分析与修正方案
你的汇编代码存在3个核心逻辑错误,直接导致内存越界访问和段错误:
- 错误1:索引计算错误
add eax, indx这行实际是将indx变量的内存地址加到eax上,而非取indx中存储的索引值。正确写法需要先读取indx的有效值再做地址偏移:movzx ebx, byte [indx] ; 读取索引值,零扩展到ebx add eax, ebx ; 计算numb数组的目标偏移地址 - 错误2:字符存储逻辑错误
mov [eax], dword char这行是把char变量的内存地址作为4字节值写入numb数组,且numb是单字节定义的数组,写入4字节会直接越界覆盖后续的indx、char等变量。你需要的是读取char中存储的输入字符,再写入数组对应位置:mov bl, [char] ; 读取输入的单字节字符 mov [eax], bl ; 写入数组的对应偏移位置 - 错误3:换行判断逻辑错误
mov eax, char后和newl比较,实际是拿char的内存地址和换行符的ASCII值比较,永远不可能相等,会导致循环无限执行,数组越界写爆内存。正确的判断逻辑是直接读取char存储的字符值和换行符比较:cmp byte [char], 0ah ; 直接判断输入的字符是不是换行 jne read
修正后可正常运行的关键代码段
_start: push msg1 push len1 call print read: push char call getc mov eax, numb movzx ebx, byte [indx] add eax, ebx mov bl, [char] mov [eax], bl inc byte [indx] cmp byte [char], 0ah jne read jmp exit
运行后输入的字符会按顺序存入numb数组,遇到换行自动退出,不会触发段错误。
内容的提问来源于stack exchange,提问作者mikaela.md
相关产品推荐
相关产品推荐

