assembly 如何从通过forth创建的汇编程序中调用forth函数

qacovj5a  于 2023-03-30  发布在  其他
关注(0)|答案(1)|浏览(164)

如果我创建一个简单地调用.的第四个单词,我可以看到它看起来像这样

: mytest . ;
see mytest
MYTEST 
( 0010D7B0    E8BB70F1FF )            CALL    00024870  .
( 0010D7B5    C3 )                    RET/NEXT
( 6 bytes, 2 instructions )

但是我很难使用CODEEND-CODE来做同样的事情。
如果我这样写代码:

CODE mytest2
CALL    00024870  .
NEXT, 
END-CODE

并尝试在命令行中包含它,我得到

Err# -4 ERR: Data stack underflow.
 Source: "/Users/xxx/scratch/forth/test1.fth" on line 3 
 -> NEXT, 
         ^
Received SIGHUP or SIGTERM

有没有什么方法可以让我用forth来用汇编语言创造单词,在其中我可以调用forth函数?也许我只是语法错误,或者也许这是不可能的?
这是VfxForth,x86_64,linux
非常感谢!
编辑:啊!我让它工作!问题是要调用的函数的地址00024870是十六进制的。它以一种表明它是十进制的格式显示出来。所以当我这样做时,它工作了:

CODE mytest2
CALL 0x00024870
NEXT,
END-CODE

当mytest 2被分解时,我得到了我想要的:

see mytest2
MYTEST2 
( 0010D9B0    E8BB6EF1FF )            CALL    00024870  .
( 0010D9B5    C3 )                    RET/NEXT
vbopmzt1

vbopmzt11#

只是张贴我自己的答案,以帮助任何人可能会绊倒在这一点上。
问题是要调用的函数的地址00024870是十六进制的,它以一种可能是十进制的格式显示出来,所以当我用0x0002487000024870公开地转换成十六进制时,它是有效的:

CODE mytest2
CALL 0x00024870
NEXT,
END-CODE

当mytest2被分解时,我得到了我想要的:

see mytest2
MYTEST2 
( 0010D9B0    E8BB6EF1FF )            CALL    00024870  .
( 0010D9B5    C3 )                    RET/NEXT

另外,请注意,CALL语句末尾的.不是法律的的汇编。相反,反汇编程序(某种程度上)会帮助添加地址Map到的函数的第四个名称。因此,如果我调用.S来查看堆栈,它会将.S放在那里。

相关问题