【问题标题】:Assembly Code keep showing segment fault汇编代码一直显示段错误
【发布时间】:2013-11-03 04:25:29
【问题描述】:

为什么这个汇编代码可以正常组装和链接,但在运行时显示段错误。在说明后发表评论,说明我想做什么。

  jmp short init

action:
  pop esi
  xor eax, eax
  mov byte [esi+24], al ;null terminating the string.
  mov dword [esi+25],24 ;length of the string

  mov al,4 ;syscall write
  mov ebx,1 ;standard out
  lea ecx,[esi]   ;<<---------- Unsure about this. probably load the address of the string to ecx  
  mov edx,[esi+25] ;<<-- load edx with string length
  int 80h


init:
  call action
  db "what a pity! not working#LLLL"

我正在使用NASM 组装和ld 链接。该程序将在 64 位机器上运行,但我希望它兼容 32 位。

【问题讨论】:

  • 你的字符串似乎在section .text(如果你不说,Nasm 将默认为)这是只读内存。试图改变它会出现段错误。如果它运行,它将永远循环。我在那里没有看到sys_exit...
  • 原来的程序有一个 sys_exit。如何让它可写?
  • 在我看来是递归的 - 进入 :init 并再次调用操作...

标签: linux assembly x86 system-calls


【解决方案1】:

您希望获得ecx 中的字符串地址。那你为什么要pop esi?使用pop ecx 并且您已经在正确的寄存器中拥有它。无论如何,你不需要它来做其他用途。

除此之外,您正在写入代码段,默认情况下不可写。

【讨论】:

  • 感谢您推荐 pop in ecx。但是pop esi 有问题吗?还有如何使代码可写
  • section .text write 将使您的 .o 文件可写。倾倒它。看,可写!但是, ld 将其更改回只读。 :(section .kode exec write 似乎有效。我认为有一种方法可以让 ld 使用.text 执行此操作,但我不知道。更好的是,不要!
猜你喜欢
  • 1970-01-01
  • 2020-08-01
  • 2023-03-12
  • 1970-01-01
  • 2021-12-16
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
相关资源
最近更新 更多