从你的提示可以看出:
第一条命令 masm 1asm执行是失败的,系统提示:无法打开1asm文件。
可能的原因是你的1asm放在别的文件夹,当前目录中没有这个文件。
既然1asm都没有打开,当然也肯定不可能生成1obj
此后第二条命令 link 1 当然肯定也失败,因为没有1obj这个文件存在
第三条命令 debug 1 错,也是因为没有 1 这个文件用汇编写64位程序与32位下有以下几点不同:
1,所用的寄存器不同于32下的eax,ebx,ecx,edx,esi,edi,esp,ebp等,在64位下是rax,rbx,rcx,rdx,rsi,rdi,rsp,rbp,此外又增加了r8,r9,r10,r11,r12,r13,r14,r15等寄存器。但eax,ax,ah,al等依然可用,且增加了spl,bpl等8位寄存器调用,r8等也可以用r8d,r8w,r8b进行32位,16位,8位的调用。
2,函数调用参数传递不同于32下的stdcall规范,而采用fastcall,前四个参数为别放入rcx,rdx,r8,r9四个寄存器中,并在堆栈中留出48=32个字节的空间,多于四个的参数放入堆栈。
3,函数调用后,由调用者负责堆栈回收。
看一个例子吧:
include \masm64\inc\user32inc ;头文件
includelib \masm64\lib\user32lib ;库文件
data ;定义数据段
strTittle db "Hello",0
strCaption db "How are you",0
code ;代码段
Main proc ;入口过程,需在汇编时定义
sub rsp,28H ;为前四个参数预留堆栈空间
xor rcx,rcx ;第一个参数0放入rcx中
lea rdx,strCaption ;把要显示的字符串地址做为第二个参数放入rdx中
lea r8,strTittle ;把消息框的标题字符串地址做为第三个参数放入r8中
xor r9,r9 ;把第四个参数0 放入r9中
call MessageBoxA ;调用MessageBoxA函数
add rsp,28H ;堆栈清理
ret ;返回
Main ends
end你遇到的这个问题,出错是因为找不到 helloworldasm文件。
找不到helloworldasm文件的原因,不是路径映射问题,而是文件名问题。
在DOSbox里,它只支持纯DOS的83短文件名。文件名最大长度不能超过8个字符。
你的问题有两个解决办法:
1 将源文件改名。
将helloworldasm改成helloasm(或其它名字,要求前面的名字长度小于或等于8个字符)。
建议用这个办法。
2 在命令行里使用系统可认的短文件名。
helloworldasm在83文件系统中的名字是hellow~1asm,你将命令改成 masm hellow~1asm即可。(用DIR命令可查看短文件名)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)