10 2013 档案

摘要:#include int main (void){ int i = 0xFFFFFFFF; __asm { push eax; mov eax,i; sal eax,31; ... 阅读全文
posted @ 2013-10-18 12:06 moon_cat 阅读(1140) 评论(0) 推荐(0)
摘要:x86汇编移位操作有5类: 1.算数逻辑移位 SAR/SAL SAL: 左移,低位空出位补0,最近移出进CF SAR: 右移,高位空出多少位,就多少位补符号位,最近移出进CF Signed int a = 5; a >>= 2; signed int 一般被翻译成 SAL/SAR 2.逻辑移位 SHL/SHR SHL:左移,低位空出位补0,最近移出进... 阅读全文
posted @ 2013-10-18 00:29 moon_cat 阅读(1360) 评论(0) 推荐(0)
摘要:今天突然遇到一个奇怪的问题,代码如下/* main.c */#include int main (void){ int dat = 0xFFFFFFFF; while (dat) { printf ( "%x\n",dat); dat >>= 1; } return (0);}#gcc -g -Wall main.c #./aFFFFFFFFFFFFFFFF.................^C# 我一直以为 signed 和 unsigned 的区别在于编译器对待他们的态度,底层永远是补码,这样,0xFFFFFFFF,按我的设想,一定是32个循环完事,因为无论 阅读全文
posted @ 2013-10-17 17:42 moon_cat 阅读(288) 评论(0) 推荐(0)
摘要:例如 0xFFFF0000 倒转 0x0000FFFF开始的时候想到一个办法,是这样:/* 32 位机器 */static unsigned reverse (unsigned dat){ int i = 0,low,high; for (i = 0 ;i >i ; high = (dat & (1>(31-i) ; dat = (dat & ~((1>= 1; }while (dat);}这个就简单多了,没有用乘除,只用累加即可。。。。。。。。 阅读全文
posted @ 2013-10-17 16:53 moon_cat 阅读(189) 评论(0) 推荐(0)
摘要:内存分配的原理__进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)。如何查看进程发生缺页中断的次数?用ps -o majflt,minflt -C program命令查看。majflt代表major fault,中文名叫大错误,minflt代表minor fault,中文名叫小错误。 这两个数值表示一个进程自启动以来所发生的缺页中断的次数。发成缺页中断后,执行了那些操作?当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作:1、检查要访问的虚拟地址是否合法2、查找/分配一个物理页3、填充物理页内容(读取磁盘,或者直接置0,或者啥也不干)4、建立映射关系 阅读全文
posted @ 2013-10-13 22:13 moon_cat 阅读(667) 评论(0) 推荐(0)
摘要:极度无聊的人才会纠结这个事情,但是今天又有人问起,做个试验,看结果咯,VC6 下测试的,GCC下待测。 阅读全文
posted @ 2013-10-13 20:32 moon_cat 阅读(179) 评论(0) 推荐(0)
摘要:# arm-linux-gcc -v xxx 4.3.3/* main.c */static unsigned *p = (unsigned*) (0x0000); /* 当外部的初始化为0,一切OK int main (void){ xxxxx; ...... ;}# arm-linux-gcc -O0 main.c -g -c -Wall 当我们不加不优化的时候 文件瞬间变的很大,当 -O2的时候,一切OK或许这个是一个BUG. 阅读全文
posted @ 2013-10-13 17:59 moon_cat 阅读(439) 评论(0) 推荐(0)
摘要:哈尔滨理工大学软件工程专业08-7李万鹏原创作品,转载请标明出处文档整理自ARM System Developer's Guide一.虚存的工作原理为了使任务有各自的虚拟存储映射,MMU硬件采用地址重定位(address relocation),即在地址访问主存之前,转换由处理器核输出的存储器地址。可认为在介于内核和主存间的MMU中有一个重定位寄存器,这样就能很容易理解这个转换过程。当处理器核产生一个虚拟地址时,MMU取 出这个虚拟地址的高位,并用重定位寄存器中的值来替换它,从而形成一个物理地址。虚拟地址的低位是一个偏移量,它转换成物理存储器的一个特定地址。一个重 定位寄存器只能转换一 阅读全文
posted @ 2013-10-13 17:58 moon_cat 阅读(1484) 评论(0) 推荐(0)
摘要:# git clone https://github.com/vim-scripts/armasm.git# mv ./arm/asm/armasm.vim /usr/share/vim/vim73/syntax/restart ur vim 阅读全文
posted @ 2013-10-13 17:55 moon_cat 阅读(405) 评论(0) 推荐(0)
摘要:ARM 进入异常模式后,访问的都是各自模式的寄存器,相互模式的访问(不包括用户模式),都是用修改 CPSR 进入另一个模式后,才访问,而相互之间的CPY SET ,都是通过 unbanked regs (R0 - R7)来做的。那么特权模式怎么访问用户态的寄存器?其实答案是很简单的,只要修改CPSR 寄存器,设置模式位即可达到进入相应模式的目的。MSRMRS两个特殊指令能做到。 阅读全文
posted @ 2013-10-13 17:51 moon_cat 阅读(855) 评论(0) 推荐(0)
摘要:进程运行必须占用内存,运行之前就已定义好的即为静态分配,运行时分配的便是动态分配。5种类型:1. 代码段 .text 存放指令代码,属性为只读。很多人不理解为什么哈弗结构既然是 .text 和 .data 分离,那只有一个RAM ,怎么解释呢,其实这很简单啊,IA32不是有选择子么 数据段有数据段的选择字,有数据段的属性,代码段有代码段的属性,有它的选择字,ARM 也无非就是将段分成不同的属性来管理,一个介质RAM搞定。2. 数据段 .data 存放已初始化数据,这个真没啥好说的。3. BSS段 .bss 存放未初始化全局变量,由此一同事问我,为什么BSS不需要占用 ... 阅读全文
posted @ 2013-10-13 17:46 moon_cat 阅读(282) 评论(0) 推荐(0)
摘要:unsigned 和 signed 之间的转化赋值非常容易被弄错,例如经典的 (-1)和 0xFFFFFFFF比较。如下: unsigned short i = -1; if (0xFFFFFFFF == i) { ..... ; /* this will not be executed forever ! */ }鉴于经常被弄错,我现在总结一下,转化规则,有几个情形:1.同位宽,同符号2.同位宽,不同符号,这个情况,就是几条mov dword [xxxx],xxxx 语句,所以操作的必然就是机器数,-1 即为 0xFFFFFFFF; 因此我们发现,不论是 : un... 阅读全文
posted @ 2013-10-12 01:11 moon_cat 阅读(1890) 评论(0) 推荐(0)
摘要:unsigned 和 signed 混合运算总是被问及,我这里总结一下。这里的几个情况:1.同等数据宽度,只要出现 unsigned ,皆以unsigned 运算。2. 同等符号前缀,自动转化为大位宽大数据范围处理,如 unsigned long long 和 unsigned int ,总以 unsigned long long 处理.3.不同数据宽度且不同数据符号前缀: unsigned short 和 int ,皆转化为 int 。 int a = -2; unsigned short = 1; a / b 等于 -2 ,因为以 int 计算; int a =... 阅读全文
posted @ 2013-10-11 23:10 moon_cat 阅读(1498) 评论(0) 推荐(1)