我试图了解旧的经典Mac应用程序的切入点.我已经反汇编了第一个CODE资源(不是CODE#0,它是跳转表).代码引用堆栈外的一些变量:0004(A7)处的一个字,一个从000C开始的长字数组(A7),其长度是0004(A7)处的值,以及超出该数组的最后一个长字似乎是一个指向字符串的指针.
长字的数组看起来像字符串乍一看,所以它看起来像我们处理(int argc,char**argv)情况,除了"argv"数组在堆栈框架中内联.
当程序首次被Mac OS调用时,程序应该在其堆栈/寄存器上期待什么?
我正在为IDA的大型Amiga项目进行逆向工程,我取得了很大的进步.但是,有一些我无法弄清楚的东西.也就是说,我发现了几个使用我认为是"跳转表"的子程序 - 但我无法弄清楚它们是如何工作的.有人有建议吗?
moveq #0,d0
move.b d7,d0 ; set D0 to a byte from CTRL
subq.w #1,d0 ; subtract 1 from it
blt.w finish_29ABA ; if D0 is less than 1, branch
cmpi.w #$16,d0
bge.w finish_29ABA ; if D0 is greater than or equal to 16, branch
add.w d0,d0 ; otherwise, double D0
move.w dword_29918(pc,d0.w),d0
jmp dword_29918+2(pc,d0.w)
; ---------------------------------------------------------------------------
dword_29918: dc.l $400036 ; CODE XREF: serialCtrlCmd+E0j
dc.l $360036
dc.l $3601A0
dc.l $3601A0
dc.l $1A001A0
dc.l $360040
dc.l $2A01A0
dc.l $400036 …
Run Code Online (Sandbox Code Playgroud) 问候所有,
本学期我正在学习微型计算机的结构和应用课程,我们正在使用Motorola 68000系列CPU /板进行编程.课程大纲建议在家里运行Easy68K或Teesside Motorola 68000 Assembler/Emulator等测试程序.
我告诉我的教授我运行x64 Linux并询问我需要什么样的环境来完成我的课程.他说,最简单的使用环境是安装了两个建议应用程序之一的Windows XP 32位虚拟机,但是,只要我可以测试我在家写的内容,他就不会真正关心我使用的内容.
所以我问是否存在适用于Linux的某种模拟器或环境,因此我可以测试我的代码,以及通过在Linux中编写和测试我的代码会遇到什么样的警告.
另外,我计划在Vim中进行编辑,这可能不是问题,但如果您有任何问题,我希望能够深入了解68000汇编的编辑器.
谢谢!
编辑:只是为了澄清 - 我根本不想在板上安装Linux - 我想在我的家用机器上编程,在本地测试代码,然后将其带到电路板上进行评级/运行.
下一学期,我需要为Motorola 68K处理器编写基本操作系统,作为课程实验材料的一部分.
是否有使用该处理器的基本硬件设置的Linux仿真器?所以我的合作伙伴和我可以在我们的计算机上更快地调试,而不是在物理上重新启动电路板和东西.
是否有可能将测试驱动的开发技术应用于OS开发?代码主要是汇编和C.尝试试驾这个主要困难是什么?关于如何做的任何建议?
有没有好的68k组装程序员在那里?我正在为摩托罗拉68040使用商业Green Hills编译器,我从代码中看到一些非常奇怪的行为.有时,代码会执行if/else比较,并采用错误的分支.例如:
float a = 1, b = 2;
if (a < b)
do c;
else
do d;
Run Code Online (Sandbox Code Playgroud)
代码有时会d !? 我发现,当发生此错误时,总会有一个特定的ISR中断比较.我看了一下ISR生成的程序集,看到了一些对我没有意义的事情.首先,看起来浮点状态寄存器FPSR,FPCR和FPIAR不会保存在ISR中.这可以解释为什么if/elses采取了错误的分支.FPSR寄存器用于确定比较结果,如果该寄存器在ISR中被覆盖,则分支可能采用错误的路径.以下是编译器生成的入口和出口程序集:
isr_function:
FSAVE -(%SP)
LINK %A6,#-192
MOVEM.L %D0/%D1/%D2/%A0/%A1,-(%SP)
FMOVEM %FP0/%FP1/%FP2/%FP3/%FP4/%FP5/%FP6/%FP7,-(%SP)
; isr code ...
FMOVEM -308(%A6),%FP0/%FP1/%FP2/%FP3/%FP4/%FP5/%FP6/%FP7
MOVEM.L -212(%A6),%D0/%D1/%D2/%A0/%A1
UNLK %A6
FRESTORE (%SP)+
RTE
Run Code Online (Sandbox Code Playgroud)
我查看了程序员参考手册,但我找不到任何暗示FSAVE或FMOVEM保存FP状态寄存器的内容.实际上,我看到一条评论表明它没有,"FSAVE不会保存程序员的浮点单元的模型寄存器;它只保存用户不可见的机器部分." 所以我添加了一些我自己的程序集以在ISR开始时保存寄存器,并在最后恢复它们,这大大提高了性能,但我仍然看到一些问题.以下是我的补充; 备份变量在C代码中键入为unsigned long:
isr_function:
FSAVE -(%SP)
LINK %A6,#-192
MOVEM.L %D0/%D1/%D2/%A0/%A1,-(%SP)
FMOVEM %FP0/%FP1/%FP2/%FP3/%FP4/%FP5/%FP6/%FP7,-(%SP)
FMOVE %FPIAR,fpiar_backup
FMOVE %FPSR,fpsr_backup
FMOVE %FPCR,fpcr_backup
; isr code ...
FMOVE fpiar_backup,%FPIAR
FMOVE fpsr_backup,%FPSR
FMOVE fpcr_backup,%FPCR
FMOVEM -308(%A6),%FP0/%FP1/%FP2/%FP3/%FP4/%FP5/%FP6/%FP7
MOVEM.L -212(%A6),%D0/%D1/%D2/%A0/%A1
UNLK %A6
FRESTORE (%SP)+ …
Run Code Online (Sandbox Code Playgroud) 我正在为一个类项目编写一些嵌入式代码,该项目当前(根据要求)创建了许多 srec 文件并合并它们。我希望能够将此代码加载到 QEMU 中,但它通常只对 ELF 文件满意。合并原始 ELF 文件而不是 srecs 的最有效方法是什么?同样可以接受的是,将 srec 转换回 ELF 并使生成的文件可加载的方法(objcopy 这样做似乎会产生相当损坏的文件(其他架构中没有架构)。这些工具必须能够使用 m68k 二进制文件,但是主机系统是普通的 x86。
之间有什么区别吗?
LEA $1000,A0
Run Code Online (Sandbox Code Playgroud)
和
MOVE #$1000,A0
Run Code Online (Sandbox Code Playgroud)
将地址放在地址注册表中?
我记得在集会课上,我们学习了m68k处理器,你可以做3种转换.线性移位,循环移位和带有延伸的圆形移位.
最后一个,带有extend的循环移位,基本上是向左或向右旋转所有位,但它将最外面的位置放到一个延伸位,然后再将它移动到开头(如果你再次移动1).
我画了一张小图:
基本上,在循环移位中使用第33位,但当然不会出现在32位字中.第33位是处理器的X标志,代表扩展.你可以很容易地使用任何状态标志,例如进位标志,但我想摩托罗拉人想要保留那个标志,这样它就不会被覆盖,以防万一你需要进行正常职责的进位标志.一些算法也需要用extend进行旋转.
无论如何,使用extend旋转的目的是什么?它是干什么用的?需要什么?看起来很奇怪.为什么世界上你需要第33位?
我读过这个和这个,两个相关的问题,但他们并没有谈及该循环移位与延伸.
我知道正常班次的一些用途.基本上除以2,或测试可分性,并置换随机性位.类似的东西.但是我想不出为什么你需要在旋转中插入一些扩展位而不会在结果中出现.
编辑:我对它的任何使用感兴趣,无论是现代的还是旧的,如果它在m68k上都无关紧要.m68k只是我遇到它的第一个位置(我从来没有在那里使用它).
我试图将68000处理器的一个可执行文件反编译成C代码,用C函数一一替换原来的子程序。
我面临的问题是我不知道如何让 gcc 使用与原始程序中使用的调用约定匹配的调用约定。我需要将堆栈上的参数打包,而不是对齐。
假设我们有以下功能
int fun(char arg1, short arg2, int arg3) {
return arg1 + arg2 + arg3;
}
Run Code Online (Sandbox Code Playgroud)
如果我们编译它
gcc -m68000 -Os -fomit-frame-pointer -S source.c
Run Code Online (Sandbox Code Playgroud)
我们得到以下输出
fun:
move.b 7(%sp),%d0
ext.w %d0
move.w 10(%sp),%a0
lea (%a0,%d0.w),%a0
move.l %a0,%d0
add.l 12(%sp),%d0
rts
Run Code Online (Sandbox Code Playgroud)
正如我们所见,编译器假定参数具有地址7(%sp)
,10(%sp)
并且12(%sp)
:
但是要使用原始程序,他们需要有地址4(%sp)
,5(%sp)
并且7(%sp)
:
一种可能的解决方案是按以下方式编写函数(处理器为大端):
int fun(int bytes4to7, int bytes8to11) {
char arg1 = bytes4to7>>24;
short arg2 = (bytes4to7>>8)&0xffff;
int arg3 = ((bytes4to7&0xff)<<24) | (bytes8to11>>8);
return arg1 + …
Run Code Online (Sandbox Code Playgroud) 我已经根据MOTOROLA M68000 FAMILY Programmer\xe2\x80\x99s Reference Manual编写了自己的Sega Mega Drive ROM 反汇编程序。拆卸了相当大的 ROM 块后,我尝试使用VASM重新组装这个拆卸的输出,因为它可以使用其语法模块接受摩托罗拉汇编语法。mot
现在,对于绝大多数重组来说,这种方法效果很好,但是,对于具有由“带索引(8 位位移)模式的程序计数器间接”定义的有效地址的操作,存在一个问题。鉴于我现在才学习 Motorola 68000 组装,我想确认我的理解并问:这些操作的正确语法是什么?
\n例如,如果我有两个词:
\n4ebb 0004\n
Run Code Online (Sandbox Code Playgroud)\n我将其解释为JSR
目标目的地是以下各项的总和:
pc
0x04
d0
(鉴于我将自己限制在 68000,我在扩展字中省略了对size
and的任何考虑scale
)。\n根据参考手册中如何描述此寻址模式,我将其发出为:
jsr ($04,pc,d0)\n
Run Code Online (Sandbox Code Playgroud)\n但是,当我将其反馈回 VASM 时,它会发出以下错误:
\nerror 2030 in line X of "XXXX.asm": displacement out of range\n> jsr ($04,pc,d0)\n
Run Code Online (Sandbox Code Playgroud)\n这似乎是一个非常奇怪的错误,因为由于寄存器的使用,位移直到运行时才能知道 …