nasm汇编
介绍linux下的nasm 64位汇编
天马行空_
先生不知何许人也。微信:without_sec,欢迎交流,互相学习。
展开
-
程序运行时,为什么栈的访问比堆的访问更快?
我不是在问,程序转换为汇编代码后,访问堆的汇编代码,多了一步,就是访问栈中的指针(局部的指针),再去访问堆。从汇编代码层面,直接访问栈和堆,为什么access stack faster than heap?是CPU缓存机制吗,还是其他?...原创 2020-09-27 21:31:41 · 382 阅读 · 0 评论 -
windows 64使用nasm
在windows中使用nasm与在Linux中有所不同,主要在于函数的调用方式,nasm在linux中使用系统调用或C库函数时,参数使用寄存器的顺序是rdi,rsi,rdx,rcx,r8,r9,而在windows下,函数参数保存到rcx,rdx,r8,r9。windows和Linux的系统调用有很多不同,windows的系统调用可以理解为Windows提供给程序员的API,也可以称为系统调用。...原创 2019-04-12 18:42:27 · 7863 阅读 · 1 评论 -
[0x01] NASM汇编 [安装NASM]
NASM是一个汇编器,适用于多个平台。这里介绍NASM在ubuntu上的安装。首先去官网下载列表进行下载:https://www.nasm.us/pub/nasm/releasebuilds/?C=M;O=D这里下载的是nasm-2.14.03rc2.tar.gz,链接:https://www.nasm.us/pub/nasm/releasebuilds/2.14.03rc2/nasm...原创 2019-02-24 12:58:09 · 1033 阅读 · 0 评论 -
[0x02] NASM汇编 [输出hello world!]
nasm官方文档:https://www.nasm.us/xdoc/2.14.03rc2/nasmdoc.pdf当遇到问题时,可以在文档中查询,文档是英文的,需要一定的英语阅读能力。下面是一个输出的例子。; hello.asmsection .data msg db 'hello, world!',0xa len equ $-msgsection .textg...原创 2019-02-24 13:52:00 · 1896 阅读 · 0 评论 -
[0x03] NASM汇编 [寄存器]
NASM中,在64位模式下,可以使用下面的寄存器:AL/AH, CL/CH, DL/DH, BL/BH, SPL, BPL, SIL, DIL, R8B−R15B AX, CX, DX, BX, SP, BP, SI, DI, R8W−R15W EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI, R8D−R15D RAX, RCX, RDX, RBX, RS...原创 2019-02-24 14:31:08 · 1758 阅读 · 0 评论 -
[0x04] nasm汇编 [数据声明和定义]
在[0x02]和[0x03]中,举了一个打印hello, world!的例子,然后介绍了在nasm中的寄存器,以及一些特定的寄存器。这节介绍数据的定义和声明。首先,要知道数据的长度,这就最基本的,就像在c语言中,char,short,int,long,long long,float,double,这些类型的字节长度是必须要知道的,在汇编中也一样。下面的表格展示了常用的数据类型。类型 ...原创 2019-02-25 10:45:24 · 3587 阅读 · 0 评论 -
[0x05] nasm汇编 [调试]
在汇编过程中,难免出现问题,需要调试,如果每次测试,都要打印可能有问题的变量,效率会非常低。掌握调试的技巧非常重要。这里使用gdb调试器,gdb是是开源组织gnu发布的,功能强大,可以调试多种语言的代码。以下面的test5_1.asm为例,展示基本的调试技巧。; test5_1.asm; nasm -f elf64 -g -o test5_1.o test5_1.asm; ld -o...原创 2019-02-25 14:27:39 · 1410 阅读 · 0 评论 -
[0x06] nasm汇编 [调用C库函数]
在nasm中,调用C库函数,需要使用extern关键字,后面跟函数名称。例子test6_1.asm; test6_1.asm; nasm -f elf64 -o test6_1.o test6_1.asm; gcc -o test6_1 test6_1.o; 或者链接: ld -o test6_1 test6_1.o -lc --dynamic-linker /lib/x86_64...原创 2019-02-26 11:04:21 · 1469 阅读 · 0 评论 -
[0x07] nasm汇编 [求和]
问题描述:输入两个整数,使用函数求出两个整数的和,并打印。这节介绍函数的使用,并对两个整数进行求和。这个过程中用到了C的库函数printf和scanf,因此需要链接C的动态链接库。思路:使用scanf输入两个整数,然后压入栈中,调用add函数。话不多说,代码如下add.asm:; add.asm; nasm -f elf64 -o add.o add.asm; gcc -o ...原创 2019-02-26 17:53:06 · 990 阅读 · 0 评论 -
[0x08] nasm汇编 [运算:加减乘除]
上节介绍了使用栈调用函数,call指令调用的时候,将当前的IP值压入栈。函数返回的时候,将栈顶的元素pop到IP中,由于默认使用_cdecl调用,因此需要调用者平衡栈。这节介绍基本的运算:加减乘除。nasm使用Intel汇编指令,可以通过查阅Intel官方文档,这里是Intel指令官方文档:https://www.intel.cn/content/dam/www/public/us/en/...原创 2019-02-27 14:05:24 · 3015 阅读 · 0 评论 -
[0x09] nasm汇编 [循环:冒泡排序]
上节介绍了简单的加减乘除运算,在除法div运算时,被除数存放在寄存器rdx:rax中,执行除法后,商存放在rax中,余数存放在rdx中;乘法mul运算中,一个乘数存放在rax中,乘法运算的结果存放在rdx:rax中。这节介绍循环,以一个冒泡排序的例子:b_sort.asm; b_sort.asm; bubble sort; nasm -f elf64 -o b_sort.o b_so...原创 2019-03-02 16:21:32 · 955 阅读 · 3 评论 -
[0xa] nasm汇编 [递归:阶乘]
使用nasm进行递归的编写,汇编代码的递归编写和C语言非常相似。; fac.asm; ubuntu 64; compile: nasm -f elf64 -o fac.o fac.asm; link: gcc -o fac fac.o; run: ./facextern printfsection .data num: dq 5 fmt: db 'fab(%...原创 2019-03-13 15:12:36 · 373 阅读 · 0 评论 -
[0xb] nasm汇编 [结构体]
在C语言中使用struct声明结构体,而在nasm汇编中,也可以使用结构体,通过使用伪指令来声明结构体。下面的struc代码展示了如何在nasm汇编中使用结构体。; struc.asm ubuntu 64; compile: nasm -f elf64 -o struc.o struc.asm; link: gcc -o struc struc.o; run: ./struc...原创 2019-03-14 16:40:13 · 1005 阅读 · 0 评论