【问题标题】:NASM programming - `int0x80` versus `int 0x80`NASM 编程 - `int0x80` 与 `int 0x80`
【发布时间】:2011-07-22 14:49:07
【问题描述】:

我有一个简单的 NASM 程序,它只调用 sys_exit:

segment .text
    global _start
    _start:
        mov eax, 1 ; 1 is the system identifier for sys_exit
        mov ebx, 0 ; exit code
        int 0x80 ; interrupt to invoke the system call

第一次写的时候搞错了,忘了int0x80之间的空格:

        int0x80

...但是程序仍然编译没有问题!

[prompt]> nasm -f elf MyProgram.asm
[prompt]> ld -o MyProgram MyProgram.o

我运行它时它只是给了我一个分段错误!

[prompt]> ./MyProgram
Segmentation fault

那么这个程序 - 我写的原始程序,缺少空格 - 做什么? int0x80(没有空格)在 NASM 中是什么意思?

segment .text
    global _start
    _start:
        mov eax, 1
        mov ebx, 0
        int0x80 ; no space...

【问题讨论】:

  • 如果int 0x80 被调用后会发生什么?
  • @pst - 好主意! * 试试看 * 好像执行正常!即使我添加了sys_write 系统调用以使其成为“Hello World”程序......就像int0x80 甚至不存在:O
  • 你的意思是分割错误消失了?
  • @BoltClock - 是的! seg 错误可能是因为int0x80 没有中断,因此没有调用系统调用sys_exit...所以执行继续超过程序的末尾进入未知的内存区域,导致seg 错误。但这仍然留下了一个问题:int0x80 是什么,它不应该编译吗?

标签: assembly syntax interrupt nasm


【解决方案1】:

NASM 给了我这个警告:

警告:在没有冒号的行上单独标注可能会出错

显然,错字被视为标签,您可以像往常一样在程序中引用新的int0x80 标签:

segment .text
    global _start
    _start:
        mov eax, 1 ; 1 is the system identifier for sys_exit
        mov ebx, 0 ; exit code
        int0x80 ; interrupt to invoke the system call

        jmp int0x80 ; jump to typo indefinitely

NASM 支持不带冒号的标签,我经常用它来声明数据:

error_msg   db "Ooops", 0
flag        db 0x80
nullpointer dd 0

【讨论】:

    【解决方案2】:

    你需要在这一行的末尾加一个冒号:

    Segment .text:
    
    global _start
    _start:
        mov eax, 1
        mov ebx, 0
        int0x80 ; no space...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-29
      • 2010-10-10
      • 2021-04-02
      • 1970-01-01
      • 2012-12-11
      • 2018-09-08
      相关资源
      最近更新 更多