#include int main (void){ int i = 0xFFFFFFFF; __asm { push eax; mov eax,i; sal eax,31; ... Read More
posted @ 2013-10-18 12:06 moon_cat Views(1035) Comments(0) Diggs(0) Edit
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,最近移出进... Read More
posted @ 2013-10-18 00:29 moon_cat Views(1280) Comments(0) Diggs(0) Edit
今天突然遇到一个奇怪的问题,代码如下/* 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个循环完事,因为无论 Read More
posted @ 2013-10-17 17:42 moon_cat Views(257) Comments(0) Diggs(0) Edit
例如 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);}这个就简单多了,没有用乘除,只用累加即可。。。。。。。。 Read More
posted @ 2013-10-17 16:53 moon_cat Views(172) Comments(0) Diggs(0) Edit
内存分配的原理__进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)。如何查看进程发生缺页中断的次数?用ps -o majflt,minflt -C program命令查看。majflt代表major fault,中文名叫大错误,minflt代表minor fault,中文名叫小错误。 这两个数值表示一个进程自启动以来所发生的缺页中断的次数。发成缺页中断后,执行了那些操作?当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作:1、检查要访问的虚拟地址是否合法2、查找/分配一个物理页3、填充物理页内容(读取磁盘,或者直接置0,或者啥也不干)4、建立映射关系 Read More
posted @ 2013-10-13 22:13 moon_cat Views(629) Comments(0) Diggs(0) Edit
极度无聊的人才会纠结这个事情,但是今天又有人问起,做个试验,看结果咯,VC6 下测试的,GCC下待测。 Read More
posted @ 2013-10-13 20:32 moon_cat Views(171) Comments(0) Diggs(0) Edit
# 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. Read More
posted @ 2013-10-13 17:59 moon_cat Views(427) Comments(0) Diggs(0) Edit
哈尔滨理工大学软件工程专业08-7李万鹏原创作品,转载请标明出处文档整理自ARM System Developer's Guide一.虚存的工作原理为了使任务有各自的虚拟存储映射,MMU硬件采用地址重定位(address relocation),即在地址访问主存之前,转换由处理器核输出的存储器地址。可认为在介于内核和主存间的MMU中有一个重定位寄存器,这样就能很容易理解这个转换过程。当处理器核产生一个虚拟地址时,MMU取 出这个虚拟地址的高位,并用重定位寄存器中的值来替换它,从而形成一个物理地址。虚拟地址的低位是一个偏移量,它转换成物理存储器的一个特定地址。一个重 定位寄存器只能转换一 Read More
posted @ 2013-10-13 17:58 moon_cat Views(1344) Comments(0) Diggs(0) Edit
# git clone https://github.com/vim-scripts/armasm.git# mv ./arm/asm/armasm.vim /usr/share/vim/vim73/syntax/restart ur vim Read More
posted @ 2013-10-13 17:55 moon_cat Views(392) Comments(0) Diggs(0) Edit
ARM 进入异常模式后,访问的都是各自模式的寄存器,相互模式的访问(不包括用户模式),都是用修改 CPSR 进入另一个模式后,才访问,而相互之间的CPY SET ,都是通过 unbanked regs (R0 - R7)来做的。那么特权模式怎么访问用户态的寄存器?其实答案是很简单的,只要修改CPSR 寄存器,设置模式位即可达到进入相应模式的目的。MSRMRS两个特殊指令能做到。 Read More
posted @ 2013-10-13 17:51 moon_cat Views(814) Comments(0) Diggs(0) Edit