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