【发布时间】:2020-12-20 16:51:58
【问题描述】:
我的操作系统:Windows 7,32 位、Intel Centrino Core*2 Duo、Toshiba A 205 Satellite、386 Pentium 笔记本电脑。 我的 binUtils:使用 BFD 版本 2.9.4 的 GNU 汇编器版本 2.9.4。 我正在使用 NetBeans IDE 7.4 版本
屏幕上显示以下错误。
Program received signal sigsegv: segmentation fault-invalid memory reference.
Backtrace for this error:
*#0 0x6f8aecb4
#1 0x6f89d642
#2 0x401138*
花.f:
CHARACTER W*1
CALL SCREEN (6)
005 OPEN (1,FILE='FLOWER.DAT')
030 READ (1,021,END=035) IR,IC,IP
CALL PIXEL (1,IR,IC)
GO TO 030
035 CLOSE (1)
021 FORMAT (I3,I3)
C READ (*,’(A\)’) W
READ (1,022) W
022 FORMAT (A1)
CALL SCREEN (3)
END
.global _screen_
_screen_:
Pushl %ebp
Movl %esp,%ebp
Movb $0,%ah
Les 6(%ebp),%bx
Mov %es:(%ebx),%al
Int $0x10 #int 16
Movl %esp,%ebp
Pop %ebp
Ret $04
.global _pixel_
_pixel_:
Pushl %ebp
Movl %esp,%ebp
Movb $12,%ah
Les 14(%ebp),%bx
Mov %es:(%ebx),%al
Les 10(%ebp),%bx
Mov %es:(%ebx),%dx
Les 6(%ebp),%bx
Mov %es:(%ebx),%cx
Int $0x10 #int 16
Movl %esp,%ebp
Pop %ebp
Ret $12*
我尝试了很多方法,但都是徒劳的。
不知道问题出在哪里,有什么解决办法?有替代品吗?
【问题讨论】:
-
les 6(%ebp), %bx几乎可以肯定是第一个错误。您无法在受保护模式的操作系统上加载 ES。然后下一条指令使用 EBX 作为地址,而它几乎肯定是垃圾。如果你设法通过了这两个方法,那么int 0x10将无法在 Windows 上运行。 -
这是一些旧的 DOS 程序集吗?你是怎么得到组装的?与Fortran代码有什么关系?
-
是的,它是旧的 DOS 程序集。 33 年前为微软的 DOS Fortran77 4.0 版本写的。
-
亲爱的prl,感谢您的早日回复。请指导/帮助我解决上述问题。什么是解决方案,以及上述我的麻烦的替代方法是什么?如果需要任何修改,它们是什么?上面提到的 Fortran,Assembly 例程写于大约 33 年前。在这期间,我非常忙于我的私人工作。退休后,我再次尝试继续这一行。从过去 3 年开始,我一直在尝试用汇编语言解决上述问题。
-
亲爱的弗拉基米尔 F,感谢您的伯爵回复。是的,它是旧的 DOS 程序集 5.0 版本。 33 年前为 DOS Fortran77 编写,4.0 版本的 Microsoft.Call Pixel,Call screen 都是与 Fortran77 相关的汇编例程,调用 Flower.f 的子例程。