请教,这段代码是否存在问题?

SilentHunter460 2021-05-23 12:58:20
请教,这段代码是否存在问题?call far ptr s 的机器码似乎不太正常,它应该包含段地址和偏移地址,但是emu8086不正确。




assume cs:code
stack segment
db 16 dup(0)
stack ends
code segment
start: mov ax, stack
mov ss, ax
mov sp, 16
mov ax, 0
call far ptr s
inc ax
s: pop ax
add ax, ax
pop bx
add ax, bx
mov ax, 4c00h
int 21h
code ends
end start
...全文
774 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
虚拟DOS、win 3.x最好的是DosBox,虚拟win98+则是VMWare,据说qemu也不错,但是没用过
zara 2021-05-23
  • 打赏
  • 举报
回复
我用 masm 汇编后看指令是正常的。
SilentHunter460 2021-05-23
  • 打赏
  • 举报
回复
引用 1 楼 zara 的回复:
是好像有些不对。这样的 far 调用,应该是 9A .... 样的指令,FF 这样的,似乎是误解成了间接转移调用,只是编码也不对。是不是这个工具对这个指令写法上有特别的规定?
请问代码用你的工具运行,结果怎么样?
zara 2021-05-23
  • 打赏
  • 举报
回复
刚才网上找了个 v4.08 在虚拟机上试了下,发现对 far 的支持确是有问题的。
定义个子程 far 属性,call 它,编译时提示 error,让参考 farfar_call_... 的 examples,看了提供的三个例子,都不是直接的 call,而是先把目标地址填到变量,再内存间接 call;直接 jmp 到子程,编译是过了,但生产的代码却并不是 far 类型的,和普通的一样,能 short 就是 short 了。
所以,这个软件,应该只是简单的入门性地用用,不能当真的。
zara 2021-05-23
  • 打赏
  • 举报
回复
是好像有些不对。这样的 far 调用,应该是 9A .... 样的指令,FF 这样的,似乎是误解成了间接转移调用,只是编码也不对。是不是这个工具对这个指令写法上有特别的规定?
  • 打赏
  • 举报
回复
如果这是它生成的机器码,那么完全汇编错了,间接调用也应该是ff 1e xx xx,不过似乎emu8086不太可能有这么严重的BUG

21,497

社区成员

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

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