【问题标题】:Tricky Assembly language syntax interface with Fortran77Fortran77 的棘手汇编语言语法接口
【发布时间】: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 的子例程。

标签: assembly x86 fortran


【解决方案1】:

您的程序集看起来很像 16 位 asm 到 32 位的盲目翻译。 AFAIK,int 16 接口仅适用于 16 位程序。如果你想坚持这个,你需要找到 32 位 api,或者制作一个合适的 16 位程序并使用任何兼容性窗口必须向前发展......

此外,screenpixel 似乎都希望将远指针作为参数,然后将其用作 16 位远指针。

【讨论】:

  • 好的,我同意你的看法。有什么办法解决这个问题?我不怪你,怎么解决?我上面提到的装配例程是否需要任何修改?如果需要,准确/正确的语法是什么?我忘记了大部分汇编语言,也准备再次学习。请进一步指导我解决有关装配程序的问题。我将在这方面做一些乏味的天文学研究工作,我正在尝试联系像你这样的专家。没有专门的 GAS 手册/参考指南,NetBeans IDE 的 GFortran 编译器。在线也没有详细的帮助。
  • 我最初的程序集,Fortran77 例程是 33 年前在 DOS 中的。在这期间,我从事私人工作。再次退休后,我试图继续在同一行。这是在 windows 模式下运行 exe 文件时出现的唯一错误。所有其他错误均无效。 EXE 文件也生成了,但运行时错误让我很困扰。如果有任何可能,请指导/帮助我解决我上面提到的麻烦。我不要求它只是要求。因为我不想浪费你宝贵的时间。
  • 我有生之年可以从事很多天文学工作。如果上帝允许我,我想尽早做一些工作。我主要依赖像你这样的专家。
  • 您需要找到与您当前环境兼容的图形库版本,或者了解您当前环境的工作原理,并为其编写一个简单的图形库。有很多可供选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-29
  • 1970-01-01
  • 2013-01-22
  • 1970-01-01
  • 2010-12-24
  • 2020-09-07
  • 1970-01-01
相关资源
最近更新 更多