深入理解计算机系统
linxizi0622
湖南大学研究生,IT男一枚
展开
-
浮点数强制转换为整型数据
今天学习了浮点数的表示方法在32位的机器中,第一位表示符号位,第二位到底9位表示为指数位剩下的位表示为小数位。给出代码// 1021.1.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#includetypedef unsigned char * byte_pointer;void show_bytes原创 2016-10-21 15:10:00 · 15656 阅读 · 0 评论 -
c语言中两个数进行运算的转化问题
c语言同时支持有符号数和无符号数当两个数进行相加的时候如果有一个数是有符号数,另一个数是无符号数,那么c语言隐式地将有符号数转化成无符号数。再进行运算。这种方法对于标准的算数来说没有多大的差异,但是对于像>或者它会导致非直观的结果。这里假设使用的是一台采用补码的32位机器。考虑比较式-1第二个运算数是无符号的,第一个运算数就会被隐式地转化为无符号数。因此表达式就等价于2原创 2016-10-20 11:07:33 · 437 阅读 · 0 评论 -
从一种数据类型到另一种数据类型的转换
当短整型强制转换为无符号的短整型的时候,字节位不变// 1020.1.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#includetypedef unsigned char *byte_pointer;void show_bytes(byte_pointer start,int len){int i;for(i=0;原创 2016-10-20 11:40:54 · 1949 阅读 · 0 评论 -
关于有符号数到无符号数的强制转换导致的一些问题
有符号数到无符号数的隐式类型强制转换导致了某些非直观性的行为。这些非直观性的行为经常导致程序错误。并且这种错误很难被发现。比如下列代码 // 1020.2.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#includefloat sun_elements(float a[],unsigned length){原创 2016-10-20 13:38:24 · 1120 阅读 · 0 评论 -
关于调用函数的实参问题
#include int add(int x,int y){return x+y;}int main(){int i=1,j=2;int x=add(i,j);return 0;}相应的汇编代码为main:.LFB1:pushl %ebpmovl %esp, %ebpsubl $24, %espmovl $1, -12(%原创 2016-11-02 09:39:18 · 801 阅读 · 0 评论 -
1/0是在编译时报错还是运行时报错
今天深信服面试,问了这个问题#includeint main(){int a=1;printf("%d",a/0);}运行这个c代码,可以发现编译时不报错运行时报错原创 2017-03-29 21:35:57 · 1692 阅读 · 0 评论 -
深信服面试题,变量指向内存区域的问题
今天面试深信服,char p[]="hello",p指向内存的那个区域?数据区,代码区,堆,栈char *q="world" q指向内存的那个区域?数据区,代码区,堆,栈#includeint main(){char p[]="hello";//p指向栈 p[0]='a';char *q="world";//q指向常量区 printf("%s\n",p);*原创 2017-03-29 23:49:24 · 362 阅读 · 0 评论 -
浮点数f和浮点数的相反数-f在内存中怎么表示
举个例子,f=3.0那么f的二进制表示为0x40400000那么-f的二进制表示为0xc0400000用下面的代码可以测得#includeunion{char x[4];float f;}a;int main(){//f=3a.x[0]=0x00;a.x[1]=0x00;a.x[2]=0x40;a.x[3]=0xC0;pr原创 2017-04-05 14:46:04 · 1812 阅读 · 0 评论 -
全局变量和局部静态变量
#includeint c=20;int a=5;void fun(int b){static int a=10;a+=b++;printf("%d\n",a);}int main(){fun(c);a+=c++;printf("%d\n",a);return 0;}结果是30 25不知道为啥原创 2017-04-27 14:38:00 · 347 阅读 · 0 评论 -
dup2重定向
/* $begin cpstdin */#include "csapp.h"int main(void){ char c;int fd;fd = open("a.txt",O_WRONLY|O_CREAT);dup2(fd,STDOUT_FILENO); while(Read(STDIN_FILENO, &c, 1) != 0)Wri原创 2017-06-06 12:14:40 · 530 阅读 · 0 评论 -
进程间通信方法-共享内存
进程之间的通信方式有管道,信号,信号量,共享内存以及套接字等等。共享内存是进程间通信效率最高的一种,只需要复制两次内存空间即可大体意思是,两个需要通信的进程A和B,都有相应的虚拟空间那么将一块内存地址映射到两个进程的虚拟地址空间中A进程通过指针访问共享内存空间,将产生一个缺页中断A进程对内存的任何更改,B进程将会访问到更改后的内容,这样就达到了进程间的通信的目的共享内存通信原创 2017-06-09 14:40:22 · 387 阅读 · 0 评论 -
深入理解黑客攻击-键盘记录器
老师是这样讲的 在计算机早期,计算机是没有鼠标的,键盘才是标配,可以没有鼠标,但是不能没有键盘所以,当键盘插进电脑上的时候,电脑应该是没有硬件提示的 所以,一般在网吧里面,我们在插键盘的usb插孔里面,插入一个键盘记录器这样,当使用键盘打字的时候,我们的键盘记录器就可以将输入的字符串记录下来并将这些字符串上传至服务器,通过对这些字符串进行分析,就能原创 2016-11-09 22:56:53 · 3273 阅读 · 0 评论 -
深入理解黑客攻击-缓冲区溢出攻击
缓冲区溢出攻击是利用缓冲区溢出漏洞所进行的攻击行动如果有人利用栈中分配的缓冲区写溢出,悄悄地将一段恶意代码的首地址作为返回地址覆盖写到原先的正确的返回地址处。那么程序在执行ret的时候会悄悄地转移到这个恶意代码段处执行从而可以轻易获得系统特权,进而进行各种非法操作造成缓冲区溢出的原因就是系统没有对作为缓冲区的数组进行越界检查给出一段代码#include <stdio....原创 2016-11-09 22:50:34 · 7447 阅读 · 3 评论 -
深入理解黑客攻击-sql注入攻击
在这个登录页面,我们需要知道用户名和密码,但是也有一种途径,不需要知道用户名和密码也可以进入网页,这叫做sql注入攻击对于上面的这个表格,左边是用户名右边是密码这是登录页面的代码StringSqlString=“Select*FromUSER Where用户名=‘”+Username.text()+”’And密码=‘”+Password.Text()+”原创 2016-11-09 11:00:10 · 2107 阅读 · 0 评论 -
关于有符号数相加发生溢出的条件码设置问题
深入理解计算机系统中的p124页的这样一个问题 c表达式:t=a+b,有符号溢出的条件码 OF :(a 这个条件码是什么意思 有符号溢出,只有当相加的两个数同为正数或者同为负数的时候才有可能发生溢出 (a0并且b>0 也就是说这两个数同号 右边括号(t0或者t>0并且a 当两个负数相加发生溢出的时原创 2016-11-05 10:00:55 · 1015 阅读 · 0 评论 -
testl指令笔记
今天上了深入理解计算机系统第三章部分,对于书上的testl指令和andl指令比较困惑详读书上的相关部分以后,有了新的见解。 test %eax,%eaxtest指令是把CF置为0了的,也就是说在按位相与的时候,低位向高位没有进位那么 test %eax,%eax就等于%eax本身,但是这个操作只是影响了标识位SF ZF PF AF并且把CF和OF置为0(因为CF原创 2016-10-25 14:25:11 · 6348 阅读 · 0 评论 -
关于汇编指令中的mov的笔记
movl src,dec; 源操作数和目的操作数不能全为内存,否则gcc编译器会报错。原创 2016-10-15 18:32:01 · 1136 阅读 · 0 评论 -
关于一个数据类型的溢出问题
今天老师讲了一个bug,大部分计算机的漏洞都是一个数据超过了这个数据类型表示的界限。导致出现漏洞。比如: char a=-128; 那么a的二进制表示为a=0x1000 0000 char b=-a; 我们设想的结果为b=128; 由于字符型变量只有8个字节,那么8个字节的有符号数表示范围为-128~127。 那么-128取相反数,得到的不是128. 根据原创 2016-10-15 19:03:21 · 697 阅读 · 0 评论 -
关于在书上学到的判断一个机器是否是大端法机器还是小端法机器的笔记
我自己先写一段代码,这是我在vs中运行过了的 #include int main() { int x=0x12345678; char *p=(char *)x; if(*p==78) printf("little endian"); else if(*p==12) printf("big endian"); }原创 2016-10-15 19:33:29 · 267 阅读 · 1 评论 -
除法和算术右移之间的巧妙取代
在大多数机器上,整数 的除法很慢,需要30多个时钟周期,除以2的幂也可以用移位运算来实现 先码上代码 #include "stdio.h" int main() { int x=-128; int y=x/4; printf("y=%d",y); }再附上汇编代码 pushl %ebp.cfi原创 2016-10-16 15:03:16 · 9303 阅读 · 0 评论 -
关于test指令和add指令的区别,inc指令和add指令的区别
经常看到这样的汇编指令inc %eax;或者add 1,%eax那么他们之间有什么区别呢?请看这样一个汇编代码 .section .text .global _start _start: nopmovb $0xff,%aladd $0x1,%al //255+1就得到256,那么就会溢出,标志位CF就会置为1.原创 2016-10-16 16:56:37 · 3030 阅读 · 0 评论 -
关于汇编中有符号数和无符号数的判断
首先给一段代码1 #include 2 int main()3 {unsigned int x=9;4 int y=-20;5 int m=(x+y>9)?1:0;6 int z=x+y;7 printf("%d\n",m);8 printf("%d\n",z);9 if(y>x) 10 {11 printf("?????\n");12原创 2016-10-16 21:32:46 · 6076 阅读 · 3 评论 -
编译和链接的区别
先看这样一篇汇编代码 .section .text .global _start _start: nop movl $4, %eax movl $1, %ebx movl $5, %ecx movl $13, %edx movl %eax,%ebx原创 2016-10-18 13:09:04 · 571 阅读 · 0 评论 -
深入理解黑客攻击-直接修改可执行文件
先给一段代码#include int main(){int i=1;if(i!=2) {printf("您购买的是盗版!!!\n");return;}printf("您购买的是正版!!!\n");return 1;}这段代码用户是看不到的但是用户能看大这段代码的可执行文件 a.out运行这个a.out得到如下图所示的结果原创 2016-11-09 11:29:26 · 1444 阅读 · 0 评论 -
深入理解黑客攻击-改变程序的返回地址
给出c代码void foo(){ inta,*p; p=(int*)((int)&a+8); *p+=12;}int main(){ foo(); printf("Print1\n"); printf("Print2\n"); printf("Print3\n"); printf("Print4\n"); return0原创 2016-11-09 12:53:30 · 678 阅读 · 0 评论 -
c语言中的右移是逻辑右移还是算术右移的问题
先上代码 // 10191.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#includeint main(){char x=0xfe;int y=x>>1;printf("%d",y);}x是有符号类型,x=1111 1110那么x>>1=1111 1111由于是有符号类型的数据,所以y原创 2016-10-19 09:41:09 · 7111 阅读 · 0 评论 -
判断系统是32位还是64位
直接上代码#include #include /* run this program using the console pauser or add your own getch, system("pause") or input loop */int main(int argc, char *argv[]) {int x=2;char *y=&x;//原创 2017-06-10 08:57:17 · 349 阅读 · 0 评论