【问题标题】:Segmentation fault(core dumped) What is the reason for this error in following assembly programme(converting uppercase to lowercase string)?分段错误(核心转储)在以下汇编程序中出现此错误的原因是什么(将大写字符串转换为小写字符串)?
【发布时间】:2018-07-29 14:33:26
【问题描述】:

我想将字符串转换为所有字符都大写的字符串。是什么导致分段错误(核心转储)?分段错误的原因是什么?

OutPut:Enter a Stringsbash: line 1:     9 Segmentation fault      (core dumped) 

来源:

    %macro accept 2
    mov eax,3
    mov ebx,0
    mov ecx,%1
    mov edx,%2
    int 0x80
    %endmacro

    %macro display 2
    mov eax,4
    mov ebx,1
    mov ecx,%1
    mov edx,%2
    int 0x80
    %endmacro

    section .data
    str1 db "Enter a String";
    len1 equ $-str1
    cnt db 0

    section .bss
    str2 resb 20
    len2 resb 1
    c resb 1


    section .text
    global _start
    _start:
    display str1,len1
    accept str2,2;
    dec al;
    mov [cnt],al
    mov si,[str2]


   up:

    mov ch,[si]
    mov bl,ch

    inc si
    cmp bl,61
    jna up
    cmp bl,73
    ja up
    mov al,20
    sub bl,20
    mov [si],bl;

    mov eax,0
    mov ebx,0;
    int 0x80

【问题讨论】:

  • 在调试器中运行您的代码并找出哪些指令错误。

标签: assembly nasm 32-bit


【解决方案1】:

可能的原因有:

  1. 你不终止循环,你需要使用cnt来统计字符,然后在cnt为0时跳出循环。
  2. 您使用 si 而不是 esi,在 32 位模式下,应该使用 esi 来寻址内存。
  3. 您应该使用mov esi,str2 而不是mov si,[str2],这样esi 会存储您的字符串地址,而不是字符串字节。
  4. exit syscall 的代码为 1,而不是 0(最后)。

另外,您可能指的是十六进制 0x61(字母 a 的代码),而不是十进制 61。与 73 和 20 相同。

【讨论】:

  • 看起来所有这些原因都会导致段错误,但要达到的第一个是 2 和 3 同时:从 [si] 加载将导致两个错误这些原因。
猜你喜欢
  • 1970-01-01
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多