在Mac中开发基于Nasm的64位汇编程序
来源:互联网 发布:上海人的特点 知乎 编辑:程序博客网 时间:2024/04/29 23:42
我们大多数人接触汇编都是在windows平台中,基于Masm开发80x86汇编语言。但是现在CPU都是64位,寻址空间也不再是以前的2^20的1MB寻址范围,而是2^64的超大寻址范围。当时之所会引出段地址和偏移地址的概念,我个人认为主要原因是寄存器的位数与地址总线位数不一致,所以才需要 段地址x16+偏移地址的形式。现在的64位CPU寄存器是64位,地址总线也是64位,因此寻址可以使用绝对内存地址的形式。
这张图片是64位CPU的结构,因此在开发64寻址模式的汇编语言时,需要采用64位寻址。
在Mac中开发64位汇编程序需要使用到Nasm,这个是本人基于Nasm开发的一个64位调试程序,可以打印数据到控制台中。
SECTION .datagupMsg: resb 100 ;显示内存区域 gupMsgLen: equ $-gupMsg ;显示区域大小gupMsgIndex: dd 0x0,0x0 ;记录显示的当前内存位置tmpMsg1: dd 0x0,0x0,0x0,0x0; 临时内存区域tmpMsg2: dd 0x0,0x0,0x0,0x0; 临时内存区域SECTION .textglobal _main;将数字转化为Acsii编码;输入rax,输出rax,rdxLongToChar: push rbx push rbp push rsi push rcx mov rbx,tmpMsg1 mov [rbx],rax mov rbp,tmpMsg2 add rbp,15 mov rsi,0 mov cx,8Ls: mov al,[rbx+rsi] mov ah,al and al,00001111b add al,0x30 cmp al,0x39 jna o1 add al,0x7o1: shr ah,0x4 and ah,00001111b add ah,0x30 cmp ah,0x39 jna o2 add ah,0x7o2: mov byte [rbp],al dec rbp mov byte [rbp],ah dec rbp inc rsi loop Ls mov rbp,tmpMsg2 mov rax,[rbp] mov rdx,[rbp+8] pop rcx pop rsi pop rbp pop rbx ret;打印rax中内容,调试tag存放在r8中LogLong: push rax push rdi push rsi push rdx push rbx push r9 call LongToChar mov rbx,gupMsg mov rbp,gupMsgIndex mov rdi,[rbp] mov r9,0x0 ;增添tag mov [rbx+rdi],r8 add rdi,8 add r9,8 mov byte [rbx+rdi],',' inc rdi inc r9 ;增添寄存器说明 mov dword [rbx+rdi],'rax=' add rdi,4 add r9,4 mov word [rbx+rdi],'0x' add rdi,2 add r9,2 ;增添真实内容 mov [rbx+rdi],rax add rdi,8 add r9,8 mov [rbx+rdi],rdx add rdi,8 add r9,8 mov byte [rbx+rdi],0x0a inc rdi inc r9 mov [rbp],rdi ;传递数据到显存 mov rax,0x2000004 mov rdi,1 mov rsi,gupMsg add rsi,[rbp] sub rsi,r9 mov rdx,r9 syscall pop r9 pop rbx pop rdx pop rsi pop rdi pop rax retkernel: syscall ret_main: ;核心代码执行 mov r8,'test1' ;调试内容标题 mov rax,0x11111 ;需要打印的调试内容 call LogLong mov r8,'test2' mov rax,rbx call LogLong mov rax,0x2000001 mov rdi,0 call kernel
使用nasm进行编译
/etc/nasm-2.12/nasm -f macho64 printf.nasm
需要使用新版本的nasm,本人放到的/etc/nasm-2.12/目录下,原代码放到了printf.nasm中。下载最新版本的nasm可以到www.nasm.us下载。
之后再链接
ld -o printf -e _main printf.o
也可以将两个命令放到一起
/etc/nasm-2.12/nasm -f macho64 printf.nasm;ld -o printf -e _main printf.o
./printf查看运行结果
2 0
- 在Mac中开发基于Nasm的64位汇编程序
- 在64位系统下编译32位汇编程序
- nasm汇编程序例程got
- 64位系统下编译32位的汇编程序
- 在win7—64位上使用DEBUG调试汇编程序
- 在64位Windows8系统下编写并调试汇编程序
- NASM汇编程序中的宏定义
- 用gdb调试nasm汇编程序
- 如何在VC中汇编,调用Nasm编写的函数
- 如何在VC中汇编,调用Nasm编写的函数
- 如何在VC中汇编,调用Nasm编写的函数
- 32位汇编语言学习笔记(29)--在NASM中使用宏
- 基于单片机的密码锁汇编程序
- VS2015中运行32位汇编程序
- 在 python 中,易于重定向的汇编程序
- nasm程序从32位到64位平台的移植(一)
- nasm程序从32位到64位平台的移植(二)
- nasm程序从32位到64位平台的移植(三)
- 工作笔记之-GestureDetector手势检测
- Selenium2 Python 自动化测试实战学习笔记(三)
- 给出入栈序列,快速判断出栈序列是否合法
- eclipse web工程中jndi数据源设置
- Jsp取得绝对路径
- 在Mac中开发基于Nasm的64位汇编程序
- 《将博客搬至CSDN》
- 最快让你上手ReactiveCocoa之进阶篇
- Fragment进阶1——Fragment与Activity之间的通信与切换
- 三维建模与飞行仿真技术,期待与您交流及合作
- 原生TabLayout使用
- uboot的relocation原理详细分析
- HTML页面中启动Activity
- 盘点SQL on Hadoop中用到的主要技术