鱼C论坛

 找回密码
 立即注册
查看: 475|回复: 10

[已解决]关于jmp far ptr的问题

[复制链接]
发表于 2023-6-1 18:00:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
你好,小甲鱼和各位大佬。
        我在学习王爽老师的汇编语言那边书的时候,对第9章里面的jmp far ptr 标号有一些问题。书上说jmp far ptr 标号 实现的是远转移(段间转移)
因此,我自己写了一个简单的代码:

        assume cs:code
        code2 segment
                a:     mov ax,4c00h
                              int 21
        code2 ends

        code segment
                start:  jmp far ptr a
        code ends

        end start      


定义了2个代码段:code和code2。并且将cs关联至code段,在code中实现jmp far ptr a。想跳转至code2段中的标号a处。

但是在用masm5.0编译的时候在a标号处报错:“missing or unreachable cs”。

就是想问一下是不是不能定义多个代码段,如果不能定义jmp far ptr的作用和意义是什么样的?

或者说,是不是我用错了,"jmp far ptr 标号"正确的用法是什么样?

谢谢大佬帮忙解答


最佳答案
2023-6-1 19:09:47

                               
登录/注册后可看大图

试试看bing写的
  1.         assume cs:code2 ; 指定cs寄存器为code2段
  2.         code2 segment
  3.                 a:     mov ax,4c00h
  4.                        int 21h
  5.         code2 ends

  6.         assume cs:code ; 指定cs寄存器为code段
  7.         code segment
  8.                 start:  jmp far ptr code2:a ; 远跳转到code2段中的a标号处
  9.         code ends

  10.         end start      
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-6-1 18:08:05 | 显示全部楼层
我看到书中给的例子中的jmp far ptr s,其中标号s是属于段内的。那么段内的话用jmp short s实现近转移即可。所以我想弄清楚jmp far ptr 标号 具体是如何实现远转移的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-1 18:26:25 | 显示全部楼层
您好,关于您的问题,我可以给您一些解释。

首先,您所编写的汇编代码在语法和逻辑上是正确的。它定义了两个代码段code和code2,并将cs寄存器关联到了代码段code,然后在代码段code中使用jmp far指令跳转到代码段code2中的标号a处。但是,在代码段code2中的标号a处出现了“missing or unreachable cs”的错误,这是由于代码段code2没有被正确加载到内存中所导致的。

其次,汇编语言中的jmp far指令是用来实现跨段或者从当前代码段中跳转到其他代码段中的标号处。在实模式下,每个代码段最大只能使用64KB的空间,如果需要访问超过64KB的数据或者代码,则需要通过跨段跳转来实现。跨段跳转需要使用段寄存器和偏移地址来确定目标地址,因此jmp far指令需要提供一个16位的段地址和一个16位的偏移地址。jmp far指令的完整形式为:jmp far ptr 段地址:偏移地址,其中far ptr表示跳转地址是一个16位段地址和一个16位偏移地址的组合。

最后,关于您的问题,多个代码段的定义是允许的,而且jmp far指令是可以正常使用的。可能是由于代码段code2没有被正确加载到内存中导致跳转失败。您可以尝试使用调试工具来查看代码段的地址和内容,以便更好地理解jmp far指令的作用和实现方式。

希望能对您有所帮助,如果还有其他问题,欢迎继续咨询。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-1 18:34:32 | 显示全部楼层
sfqxx 发表于 2023-6-1 18:26
您好,关于您的问题,我可以给您一些解释。

首先,您所编写的汇编代码在语法和逻辑上是正确的。它定义了 ...

您好,关于您说没有被正确加载到内存中导致。但是我是在编译阶段就报了missing or reachable cs的错误。 无法编译成功
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-1 19:04:28 | 显示全部楼层
soul3500 发表于 2023-6-1 18:34
您好,关于您说没有被正确加载到内存中导致。但是我是在编译阶段就报了missing or reachable cs的错误。{ ...

问的chatgpt罢了,可能是胡说八道的,别全信
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-1 19:08:53 | 显示全部楼层
wuliangtdi 发表于 2023-6-1 19:04
问的chatgpt罢了,可能是胡说八道的,别全信

好的 大佬。就是这个问题,我实在想不出来。是否是masm编译器 不支持 定义多个段啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-1 19:09:47 | 显示全部楼层    本楼为最佳答案   

                               
登录/注册后可看大图

试试看bing写的
  1.         assume cs:code2 ; 指定cs寄存器为code2段
  2.         code2 segment
  3.                 a:     mov ax,4c00h
  4.                        int 21h
  5.         code2 ends

  6.         assume cs:code ; 指定cs寄存器为code段
  7.         code segment
  8.                 start:  jmp far ptr code2:a ; 远跳转到code2段中的a标号处
  9.         code ends

  10.         end start      
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-1 19:16:39 From FishC Mobile | 显示全部楼层
wuliangtdi 发表于 2023-6-1 19:04
问的chatgpt罢了,可能是胡说八道的,别全信

6
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-1 19:30:35 | 显示全部楼层
soul3500 发表于 2023-6-1 18:34
您好,关于您说没有被正确加载到内存中导致。但是我是在编译阶段就报了missing or reachable cs的错误。{ ...

刚刚试了一下bing给出的代码,能编译成obj文件

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-1 19:46:57 | 显示全部楼层
soul3500 发表于 2023-6-1 19:08
好的 大佬。就是这个问题,我实在想不出来。是否是masm编译器 不支持 定义多个段啊


                               
登录/注册后可看大图

编译通过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-2 11:05:00 | 显示全部楼层

谢谢大佬,我增加了一行 assume cs:code2 就可以通过了

这是修改后的代码:
assume cs:code2

code2 segment
a:    mov ax,4c00h
      int 21h
code2 ends

assume cs:code
code segment
start:  jmp far ptr a
code ends

end start


对于assume 这个伪指令还不是非常熟悉,以为只能定义一次assume
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 12:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表