汇编语言
文章平均质量分 74
unix21
这个作者很懒,什么都没留下…
展开
-
汇编语言调用Linux系统调用
首先查找系统调用文件#find / -name unistd.h/root/linux/include/unistd.h/usr/include/linux/unistd.h/usr/include/sys/unistd.h/usr/include/bits/unistd.h/usr/include/unistd.h查看系统调用值/root/linux/incl原创 2012-12-29 13:15:47 · 1092 阅读 · 0 评论 -
Linux环境下的堆栈--调试C程序
完整的调试过程,跟踪堆栈变化,32位下。注意64位和此不同。 a.c代码:#include int main() { AFunc(5,6); return 0;} int BFunc(int i,int j){ int m = 1; int n = 2; m = i; n = j; return m;原创 2013-01-13 15:07:36 · 2504 阅读 · 0 评论 -
汇编包含C代码
反汇编的时候带上C代码便于观察 比较三元表达式和if else的差异a1.c#include int main(void) { int a=1;int b=2;int c=0;a = (b>c)?1:0;return 0;}a2.c#include int main(void) { int a=1;原创 2013-01-15 18:42:13 · 800 阅读 · 0 评论 -
.data和.text段合并
a.c#include extern int share;int main(void) { int a=100;swap(&a,&share);} b.cint share=1;void swap(int *a,int *b){*a^=*b^=*a^=*b;}编译#gcc -c a.c b.c 链接#ld原创 2013-01-05 22:55:39 · 973 阅读 · 0 评论 -
objdump查看目标文件构成
objdumpobjdump是用查看目标文件或者可执行的目标文件的构成的GCC工具反汇编#objdump -d cpuid2对于其中的反汇编代码左边是机器指令的字节,右边是反汇编结果。显然,所有的符号都被替换成地址了, 注意没有加$的数表示内存地址,而不表示立即数。objdump -x obj 以某种分类信息的形式把目标文件的数据组织(被分为几大原创 2013-01-04 21:43:47 · 3114 阅读 · 0 评论 -
objdump与readelf
objdump和readelf都可以用来查看二进制文件的一些内部信息. 区别在于objdump借助BFD而更加通用一些, 可以应付不同文件格式, readelf则并不借助BFD, 而是直接读取ELF格式文件的信息, 按readelf手册页上所说, 得到的信息也略细致一些. 几个功能对比. 1. 反汇编代码查看源代码被翻译成的汇编代码, 大概有3种方法, 1) 通过编译器原创 2013-01-04 22:36:16 · 1514 阅读 · 0 评论 -
unix环境汇编语言常用工具
汇编器MASM:微软的汇编器不支持unixNASM:unix环境下兼容微软平台GAS:GNU 的免费软件包,unix环境下最流行跨平台汇编器安装GNU汇编器检查binunitsRedHat#rpm -qa |grep binunitsDebian#dpkg -l|grep binunit下载地址:找最新的安装包下载安装#wget原创 2012-12-29 13:04:35 · 1102 阅读 · 0 评论 -
汇编语言系统调用过程
以printf为例,详细解析一个简单的printf调用里头,系统究竟做了什么,各寄存器究竟如何变化。如何在汇编调用glibc的函数?其实也很简单,根据c convention call的规则,参数反向压栈,call,然后结果保存在eax里头。注意,保存的是地址。在汇编里头,一切皆地址。当我们调用 result = printf( "%d %d", 12, a )的时候,编译器默原创 2012-12-29 12:42:22 · 3342 阅读 · 0 评论 -
ATT格式汇编语言
1.编译与链接方法一:使用as#as -o test.o test.s#ld -o test test.o方法二:使用gcc#gcc -o test test.sgnu连接器查找_start标签以确定程序的开始,但gcc查找main标签,所以使用gcc要把 _start改为main2.调试#as -gstabs -o test.o test.s#ld原创 2012-12-29 13:17:23 · 2112 阅读 · 0 评论 -
关于text段、data段和bss段
根据APUE,程序分为下面的段:.text, data (initialized), bss, stack, heap。data/bss/text:text段在内存中被映射为只读,但.data和.bss是可写的。bss是英文Block Started by Symbol的简称,通常是指用来存放程序中未初始化的全局变量的一块内存区域,在程序载入时由内核清0。BSS段属于静态内存分配。它的原创 2013-01-01 10:05:37 · 13031 阅读 · 0 评论 -
从寄存器看I386和x64位中函数调用中参数传递
x86_64基本使用寄存器存储函数参数,寄存器不够才入栈;而i386将所有参数保存在栈上,通过gcc的扩展功能__attribute__((regparm()))即可实现部分参数的寄存器传递。代码#include #include int v1 = 1;float v2 = 0.01;#ifdef FAST__attribute__((regparm(3))原创 2012-12-29 13:03:32 · 8901 阅读 · 0 评论