soul3500 发表于 2023-6-1 18:00:22

关于jmp far ptr的问题

你好,小甲鱼和各位大佬。
      我在学习王爽老师的汇编语言那边书的时候,对第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 标号"正确的用法是什么样?

谢谢大佬帮忙解答


soul3500 发表于 2023-6-1 18:08:05

我看到书中给的例子中的jmp far ptr s,其中标号s是属于段内的。那么段内的话用jmp short s实现近转移即可。所以我想弄清楚jmp far ptr 标号 具体是如何实现远转移的

sfqxx 发表于 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指令的作用和实现方式。

希望能对您有所帮助,如果还有其他问题,欢迎继续咨询。

soul3500 发表于 2023-6-1 18:34:32

sfqxx 发表于 2023-6-1 18:26
您好,关于您的问题,我可以给您一些解释。

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

您好,关于您说没有被正确加载到内存中导致。但是我是在编译阶段就报了missing or reachable cs的错误。{:10_266:} 无法编译成功

wuliangtdi 发表于 2023-6-1 19:04:28

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

问的chatgpt罢了,可能是胡说八道的,别全信{:10_256:}

soul3500 发表于 2023-6-1 19:08:53

wuliangtdi 发表于 2023-6-1 19:04
问的chatgpt罢了,可能是胡说八道的,别全信

好的 大佬。就是这个问题,我实在想不出来。是否是masm编译器 不支持 定义多个段啊

wuliangtdi 发表于 2023-6-1 19:09:47

https://i.imgloc.com/2023/06/01/VkUSYd.png
试试看bing写的
      assume cs:code2 ; 指定cs寄存器为code2段
      code2 segment
                a:   mov ax,4c00h
                     int 21h
      code2 ends

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

      end start      

sfqxx 发表于 2023-6-1 19:16:39

wuliangtdi 发表于 2023-6-1 19:04
问的chatgpt罢了,可能是胡说八道的,别全信

6

wuliangtdi 发表于 2023-6-1 19:30:35

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

刚刚试了一下bing给出的代码,能编译成obj文件
https://i.imgloc.com/2023/06/01/VkU1Gp.png

wuliangtdi 发表于 2023-6-1 19:46:57

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

https://i.imgloc.com/2023/06/01/VknVt5.png
编译通过

soul3500 发表于 2023-6-2 11:05:00

wuliangtdi 发表于 2023-6-1 19:09
试试看bing写的

谢谢大佬,我增加了一行 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
页: [1]
查看完整版本: 关于jmp far ptr的问题