当前位置: 代码迷 >> 汇编语言 >> com文件,tiny内存模式下怎么jmp
  详细解决方案

com文件,tiny内存模式下怎么jmp

热度:8737   发布时间:2013-02-26 00:00:00.0
com文件,tiny内存模式下如何jmp
com文件内,从外面读取 一小段程序到一个内存地址(比如0600),没有预定义空间,
而是直接利用int13中断,读入到一个起始地址(这个地址可以直接给嘛??)。
那么如何跳转到
这个地址呢?
我将mov bx,0600
jmp bx
结果出错了啊?

------解决方案--------------------------------------------------------
可以将目标地址 push 压栈,然 ret 指令转去;也可以将目标地址给个变量,然后 jmp 间接转移过去
------解决方案--------------------------------------------------------
学习.........
------解决方案--------------------------------------------------------
com 不需要你定义堆栈空间的,缺省的就是所在段的最后。所以,只有程序不是特别大到几近 64K-100h,或对段末有数据安排,就可以使用堆栈指令。

在源程序级,jmp 到一个数据变量,最后的指令是以该变量的值为目标地址:
var_to dw ?
...
mov var_to, bx
jmp var_to ; 这样也可以了
------解决方案--------------------------------------------------------
呃,这个帖子怎么在各个板块间不停地游走?

内存地址如何定义,什么意思?如果觉得特殊需要,使用变量比较困难的话,就用 push-ret 的方法吧:
mov bx, 0600
push bx
retn
------解决方案--------------------------------------------------------
jmp bx其实是 jmp cs:bx
应该是需要注意 cs
------解决方案--------------------------------------------------------
jmp far ptr 600

or

jmp dword ptr 变量,也可
------解决方案--------------------------------------------------------
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,否则很可能出错。
------解决方案--------------------------------------------------------
Assembly code
ORIGIN EQU 0100H ;  .386.model tiny.codeORG ORIGINstart:  MOV AL,'B'  MOV BL,03H  MOV AH,0EH  INT 10H  xor ax,ax  mov cs,ax  mov bx,0100H  JMP bx end start
------解决方案--------------------------------------------------------
探讨
不能mov cs,ax
谁说的?可以的

------解决方案--------------------------------------------------------
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,这可能也是原因之一。
------解决方案--------------------------------------------------------
先push段内地址,再push 段地址,然后ret

------解决方案--------------------------------------------------------
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写的
------解决方案--------------------------------------------------------
探讨
先push段内地址,再push 段地址,然后ret

------解决方案--------------------------------------------------------
这和 masm 有什么关系?在 xp 的图形界面下双击生成的这个可执行程序,管谁创建的,还不都是一闪而过吧。对这类 dos 程序,建议先进入命令行窗口,然后再运行;如果显示输出采用的方法比较特殊,可能还要切换到全屏,甚至是纯 dos (可以用虚拟机)的。
------解决方案--------------------------------------------------------
探讨
引用:
先push段内地址,再push 段地址,然后ret

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