com文件,tiny内存模式下如何jmp

guangmingdeshenju 2010-04-01 03:34:21
com文件内,从外面读取 一小段程序到一个内存地址(比如0600),没有预定义空间,
而是直接利用int13中断,读入到一个起始地址(这个地址可以直接给嘛??)。
那么如何跳转到
这个地址呢?
我将mov bx,0600
jmp bx
结果出错了啊?
...全文
163 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
1cctv 2010-04-02
  • 打赏
  • 举报
回复
jmp far ptr 600 不好用吗?
用户 昵称 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 zara 的回复:]
引用 17 楼 jennyvenus 的回复:
先push段内地址,再push 段地址,然后ret

这个不对的!应该是先 push 段地址,再是段内地址,然后 retf 必需明确使用 retf 指令,防止汇编程序根据上下文 proc 定义误解释为 retn 指令。
[/Quote]

我记错了,我以前的程序是这么写的

data segment
hello db "hello, world!", 0dh, 0ah, '$'
data ends

stack segment stack para 'stack' stack
s db 1000 dup( 0 )
stack ends

code segment
assume cs:code, ds:data, ss:stack

start:
mov ax, data
mov ds, ax

db 0eah
dw offset print
dw seg print

mov ah, 4ch
int 21h


print:
mov dx, offset hello
mov ah, 9
int 21h

mov ah, 4ch
int 21H

code ends
end start
blackfacewa 2010-04-02
  • 打赏
  • 举报
回复
int 10这个bios中断好像不能再windows下运行吧
zara 2010-04-02
  • 打赏
  • 举报
回复
这和 masm 有什么关系?在 xp 的图形界面下双击生成的这个可执行程序,管谁创建的,还不都是一闪而过吧。对这类 dos 程序,建议先进入命令行窗口,然后再运行;如果显示输出采用的方法比较特殊,可能还要切换到全屏,甚至是纯 dos (可以用虚拟机)的。
guangmingdeshenju 2010-04-02
  • 打赏
  • 举报
回复
ORIGIN EQU 0100H ;
.386
.model tiny

.code
ORG ORIGIN
start:


mov dl,61h
mov ah,02h
int 21h


mov bx,0000h
push bx
mov bx,0100h
push bx
retf

end start


winxp下一闪而过啊,在debug下可以的,一用masm就不行了哦
zara 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 jennyvenus 的回复:]
先push段内地址,再push 段地址,然后ret
[/Quote]
这个不对的!应该是先 push 段地址,再是段内地址,然后 retf 必需明确使用 retf 指令,防止汇编程序根据上下文 proc 定义误解释为 retn 指令。
fdisksys 2010-04-02
  • 打赏
  • 举报
回复
assume cs:bootload
bootload segment
_start:
mov ax,1000h
mov es,ax
mov bx,0
mov ah,02h
mov al,1
mov cx,03h
xor dx,dx
int 13h
mov ax,1000h
push ax
xor ax,ax
push ax
retf
bootload ends
end _start
用MASM5.0写的
用户 昵称 2010-04-02
  • 打赏
  • 举报
回复
先push段内地址,再push 段地址,然后ret
alZou 2010-04-02
  • 打赏
  • 举报
回复
jmp.asm源码如下:

org 100h
use16

MOV AL,'B'
MOV BL,03H
MOV AH,0EH
INT 10H

mov bx,0100h
JMP bx

用fasm编译:fasm jmp.asm

运行jmp.com,一直输出B

我一直不喜欢用masm,这可能也是原因之一。
zara 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 guangmingdeshenju 的回复:]
不能mov cs,ax
谁说的?可以的
[/Quote]

真的不可以!指令格式上确实可以,但指令功能的实现上,限定了不允许!
The MOV instruction cannot be used to load the CS register. Attempting to do so results in an invalid opcode exception (#UD). To load the CS register, use the far JMP, CALL, or RET instruction.
guangmingdeshenju 2010-04-02
  • 打赏
  • 举报
回复
不能mov cs,ax
谁说的?可以的
blackfacewa 2010-04-01
  • 打赏
  • 举报
回复


ORIGIN EQU 0100H ;
.386
.model tiny
.code
ORG ORIGIN
start:
MOV AL,'B'
MOV BL,03H
MOV AH,0EH
INT 10H

xor ax,ax
mov cs,ax
mov bx,0100H
JMP bx

end start

环境变量
X:\Masm_test>set include=X:\Masm32\Include
X:\Masm_test>set lib=X:\Masm32\lib
X:\Masm_test>set path=X:\Masm32\Bin
编译
X:\Masm_test>ml /c /coff jmp.asm
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997. All rights reserved.

Assembling: jmp.asm
error A4910: cannot open file: X:\masm32\Bin\ml.err
jmp.asm(18) : warning A4023: : start
链接
X:\Masm_test>polink /subsystem:windows /entry:start /DEFAULTLIB:X:\masm32\lib\kernel32.lib jmp.obj
运行
X:\Masm_test>jmp.exe

结果:报错了

cnzdgs 2010-04-01
  • 打赏
  • 举报
回复
mov cs,ax
没有这样的指令,cs不能用mov指令赋值。
如果要跳转到0:600,可以用
push 0
push 600h
retf
如果用8086指令可以改为
xor ax,ax
push ax
mov ax,600h
push ax
retf

引导程序应加载到0:7c00h,否则很可能出错。
1cctv 2010-04-01
  • 打赏
  • 举报
回复
jmp far ptr 600

or

jmp dword ptr 变量,也可
guangmingdeshenju 2010-04-01
  • 打赏
  • 举报
回复

ORIGIN EQU 0100H ;
.386
.model tiny
.code
ORG ORIGIN
start:


MOV AL,'B'
MOV BL,03H
MOV AH,0EH
INT 10H

xor ax,ax
mov cs,ax
mov bx,0100
JMP bx ;

end start

按理应该一直无限 循环 啊,一直输出B啊,结果执行就出错
“无效指令”
guangmingdeshenju 2010-04-01
  • 打赏
  • 举报
回复
哦,还有直接jmp 变量 是不行的
jmp 0000h:0600 也不行哦
xiaopoy 2010-04-01
  • 打赏
  • 举报
回复
jmp bx其实是 jmp cs:bx
应该是需要注意 cs
guangmingdeshenju 2010-04-01
  • 打赏
  • 举报
回复
还是不行啊?我这是在模拟 系统主引导程序啊
zara 2010-04-01
  • 打赏
  • 举报
回复
呃,这个帖子怎么在各个板块间不停地游走?

内存地址如何定义,什么意思?如果觉得特殊需要,使用变量比较困难的话,就用 push-ret 的方法吧:
mov bx, 0600
push bx
retn
guangmingdeshenju 2010-04-01
  • 打赏
  • 举报
回复
那个 内存地址如何 定义呢?偏移?还是逻辑?
我用的偏移,应该不对吧???
谢谢指教
加载更多回复(4)

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧