在 Linux 上替换字符 x86 NASM 时出现分段错误

问题描述

在我的变量定义为 mov [gtt+4],byte '>' 的情况下,我在写入 gtt: db "I'm ! than 10" 后遇到分段错误

感觉可能是汇编程序出错了。
我正在使用以下命令:nasm -f elf file.asm -o file.old -m elf_i386 file.o -o file 我曾尝试使用 elf32 而不是 elf 但它没有任何区别。

我的程序的目的是循环 2 次,每次将 ebx 中的值乘以 2。之后,它会比较 ecx > 10 并显示相应的字符串。我试图让它取代“!”带有“”。

我使用的是 Ubuntu,我正在使用 x86 程序集。 这是我的完整代码片段:


section .data:
    starti: db "Starting value: 1",0x0a
    startil equ $-starti

    gtt: db "I'm > than 10!",0x0a
    gttml equ $-gtt 

section .text:
_start:
    mov eax,4
    mov ebx,1
    mov ecx,starti
    mov edx,startil
    int 0x80

    mov ebx,1  ; Start value!  
    mov ecx,2  ; Number of iterations  


label:
    add ebx,ebx    ; Add 2*ebx
    dec ecx     ; ecx -= 1
    cmp ecx,0  ; If ecx > 0,loop again
    jg label
    
    cmp ebx,10 ; If cbx > 10,jump to gtt-g
    jg gttg

    mov [gtt+4],byte '<'
    mov eax,4  ; If cbx < 10,output <
    mov ebx,gtt
    mov edx,gttml
    int 0x80

    mov eax,1  ; Exit gracefully
    mov ebx,0
    int 0x80
    
gttg: 
    mov [gtt+4],byte '>'
    mov eax,4  ; display gtt
    mov ebx,gttml
    int 0x80
    
    mov eax,0
    int 0x80

修复
感谢 Jester,“您不能在部分名称后使用冒号,它们不是标签。事实上,冒号包含在名称中,因此汇编器不会将它们识别为标准部分,并且不会应用预期属性意味着您的数据是只读的。TL;DR:使用部分 .data 和部分 .text 没有尾随“。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)