鱼C论坛

 找回密码
 立即注册
查看: 4117|回复: 5

[已解决]jmp改变cs和ip问题

[复制链接]
发表于 2020-2-4 11:59:05 | 显示全部楼层 |阅读模式

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

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

x
为什么jmp 1000:3这样的形式会报错
C:\Users\pengshao\Desktop\dos报错.png
C:\Users\pengshao\Desktop\代码.png
  1. DATAS SEGMENT
  2.     ;此处输入数据段代码  
  3. DATAS ENDS

  4. STACKS SEGMENT
  5.     ;此处输入堆栈段代码
  6. STACKS ENDS

  7. CODES SEGMENT
  8.     ASSUME CS:CODES,DS:DATAS,SS:STACKS
  9. START:
  10.     MOV AX,DATAS
  11.     MOV DS,AX
  12.     mov ax,1123h
  13.     mov bx,1243h
  14.     jmp 0020:0020
  15.     MOV AH,4CH
  16.     INT 21H
  17. CODES ENDS
  18.     END START
复制代码
最佳答案
2020-2-4 17:10:05
pengshao 发表于 2020-2-4 14:20
大佬啊,这是什么啊,居然还能运行;
我想知道的是jmp 1000:3这种汇编指令,为什么编译器会报错,是什么原 ...


      MASM 不支持
  1. jmp 1000:3
复制代码

      这种格式的 jmp 指令,必须想办法变通。这种形式的代码只能在 debug 中看到,在源代码中一定是 jmp far ptr <标号> 这种形式。
      对于远程跳转
  1.         jmp 1000:3
复制代码

      可以这么写:
  1.         mov ax,1000h
  2.         push ax
  3.         mov ax,3h
  4.         push ax
  5.         retf
复制代码

        当然,也可以这么写:
  1.         db 0eah , 03h , 00h ,  00h , 10h
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-4 12:08:34 | 显示全部楼层
dos报错:
Drive C mounted as local directory D: \\asm
Z:>C:
: \\>masm a.asm;
Microsoft (R) Macro Assembler Version 5.10
Copyright (C) Microsoft Corp 1981, 1988. All rights reserved.
a. asm(16): error A2038: Left operand must have segment
50104+ 463301 Bytes symbol space free
Warning Errors
1 Severe Errors
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-4 13:40:29 | 显示全部楼层
本帖最后由 jackz007 于 2020-2-4 13:42 编辑

        把这一句
  1.     jmp 0020:0020
复制代码

        替换为:
  1.     db 0eah , 20h , 00h , 20h , 00h
复制代码

        试试看呢

        当然,你只能用 debug 把它加载进去看,不能实际运行,否则,这条长跳转指令足以使你的程序失控!
   
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-4 14:20:22 | 显示全部楼层
大佬啊,这是什么啊,居然还能运行;
我想知道的是jmp 1000:3这种汇编指令,为什么编译器会报错,是什么原因?
是只有我报错,还是有很多这种情况?想不出来,脑袋疼。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-4 17:10:05 | 显示全部楼层    本楼为最佳答案   
pengshao 发表于 2020-2-4 14:20
大佬啊,这是什么啊,居然还能运行;
我想知道的是jmp 1000:3这种汇编指令,为什么编译器会报错,是什么原 ...


      MASM 不支持
  1. jmp 1000:3
复制代码

      这种格式的 jmp 指令,必须想办法变通。这种形式的代码只能在 debug 中看到,在源代码中一定是 jmp far ptr <标号> 这种形式。
      对于远程跳转
  1.         jmp 1000:3
复制代码

      可以这么写:
  1.         mov ax,1000h
  2.         push ax
  3.         mov ax,3h
  4.         push ax
  5.         retf
复制代码

        当然,也可以这么写:
  1.         db 0eah , 03h , 00h ,  00h , 10h
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-2-4 17:48:13 | 显示全部楼层
感谢大佬的解答
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-9 15:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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