恋恋风辰的个人博客


  • Home

  • Archives

  • Categories

  • Tags

  • Search

汇编语言学习笔记(二)

Posted on 2017-08-12 | In 汇编

六、选择结构

if-then结构

C语言版本

1
2
3
4
5
if(count == 10)
{
count --;
i++;
}

MASM汇编

1
2
3
4
.if count==10
dec count
inc i
.endif

cmp指令,该指令用于比较两个参数大小

cmp mem, imm 比较内存mem和立即数imm大小

cmp reg, imm 比较寄存器reg和立即数imm大小

cmp reg, mem 比较寄存器reg和内存mem大小

cmp mem, reg 比较内存mem和寄存器reg大小

cmp imm, reg 比较立即数和寄存器reg大小

cmp imm, mem比较立即数和内存mem大小

cmp reg, reg比较两个寄存器数据大小

.if 内部是通过cmp实现的,.if和cmp都不能比较两个内存中数据大小

Read more »

汇编语言学习笔记(一)

Posted on 2017-08-12 | In 汇编

一:变量类型

汇编语言变量基本类型如下:

sdword :表示32位整数

dword:表示32位无符号整数

sword:表示16位整数

word:表示16位无符号整数

sbyte:表示8位整数

byte:用于表示字节,大小为8位

变量的表示和定义:

C语言中

1
int num3 = 5;

汇编中

1
num3 sdword 5;

C语言中

1
2
3
char name1;

char name2=‘A’;

汇编中:

1
2
3
name1 byte ?

name2 byte ‘A’;

C语言中:

1
char name[] = "iloveu";

汇编中:

1
name byte ‘iloveu’,0 ;字符串结汇通常带有二进制的0,占用一个字节。
Read more »

win7 64位环境下配置汇编环境和程序设计

Posted on 2017-08-12 | In 汇编

下载dosbox,并解压安装

下载地址: http://pan.baidu.com/s/1eRJbJAq

默认安装到C:\Program Files (x86)\DOSBox-0.74

安装成功后,双击该目录下DOSBox 0.74 Options.bat文件,弹出配置选项文本文档,

找到[autoexec]选项,在下面添加如下字段:

1
2
MOUNT C D:\masmpro 
set PATH=$PATH$;D:\masmpro

D:\masmpro是我创建的汇编程序目录,这样每次启动dosbox,自动挂载到我自己的项目目录里。

当然也可以手动设置,启动dosbox,手动输入MOUNT C D:\masmpro 然后回车

效果如下:
1.png

Read more »

makefile学习笔记

Posted on 2017-08-12 | In Linux

之前都是手动编译的,最近也学了下makefile相关的知识,文件结构是这样的在server文件夹里有eventloop.h,eventloop.cpp, networking.h, networking.cpp,

api_epoll.h, api_epoll.cpp,以及文件夹main,在main文件夹里有一个main.cpp文件。

先写一个简单的makefile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
./server: eventloop.o api_epoll.o networking.o main.o
g++ -o ./server eventloop.o api_epoll.o networking.o main.o

main.o: ./main/main.cpp eventloop.h api_epoll.h networking.h
g++ -c ./main/main.cpp -o main.o

eventloop.o: eventloop.cpp eventloop.h api_epoll.h
g++ -c eventloop.cpp -o eventloop.o

api_epoll.o: api_epoll.cpp api_epoll.h eventloop.h
g++ -c api_epoll.cpp -o api_epoll.o

networking.o: networking.cpp networking.h eventloop.h
g++ -c networking.cpp -o networking.o

clean:
rm -f $(OBJS) $(TARGET)

makefile基本写法是

目标:依赖项

  command

Read more »

Linux环境编译动态库和静态库总结

Posted on 2017-08-08 | In Linux

对Linux环境动态库和静态库的一些基础知识做一些总结,

首先总结静态库的编译步骤。

1 先基于.cpp或者.c文件生成对应的.o文件

2将几个.o文件 使用ar -cr命令 生成libname.a文件

libname.a 为静态库, name 为静态库的名字,

可以根据模块功能命名。

举个例子

在当前目录下,有一个mymethod.h文件
1.png

Read more »

pthread_cond_wait学习笔记

Posted on 2017-08-08 | In 网络编程

近期学习了线程等待和激活的相关知识。

先介绍几个api:

pthread_cond_t表示多线程的条件变量,用于控制线程等待和就绪的条件。

一:条件变量的初始化:

条件变量和互斥锁一样,都有静态动态两种创建方式,

静态方式使用PTHREAD_COND_INITIALIZER常量初始化。

pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

动态方式初始化:

1 首先要new或者malloc一个pthread_cond_t类型变量,

用完后记得delete或者free掉。

2动态方式

调用pthread_cond_init()函数,API定义如下:

int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);

Read more »

Linux环境崩溃生成core文件以及调试

Posted on 2017-08-07 | In Linux

Windows环境崩溃问题可根据vs调试工具查看,Linux同样可以查看调用堆栈的信息,只是

需要更改Linux设置,使程序崩溃时候产生core文件。然后gdb调试即可。

1产生core文件方法

产生coredump的条件,首先需要确认当前会话的ulimit –c,若为0,则不会产生对应的coredump,需要进行修改和设置。

ulimit -c unlimited (可以产生coredump且不受大小限制),这种设置仅对当前生效,如果想永久生效

那么需要在

/etc/profile中加入以下一行,这将允许生成coredump文件

ulimit-c unlimited

Read more »

对于redis底层框架的理解(一)

Posted on 2017-08-07 | In 网络编程

近期学习了redis底层框架,好多东西之前都没听说过,算是大开眼界了。
先梳理下redis正常的通讯流程吧
首先服务器启动都有主函数main,这个main函数就在redis.c里

首先是initserverconfig(),在这里初始化了redisserver基本的配置信息,

接着调用loadServerConfig(char *filename) 对 server 全局变量重新初始化。

然后是调用daemonize(),实现守护进程,脱离了控制台,使这个进程成为独立的首领进程

接下来是initServer(),这个过程很重要,完成了事件驱动的注册和一些回调函数的绑定,回头仔细说这个函数里面的功能

初始化服务器过后aeSetBeforeSleepProc(),设置了服务器休眠之前会

调用beforeSleep函数,然后进入主要的事件轮询函数 aeMain(server.el),在这里完成事件的派发

最后事件轮询过后我们调用aeDeleteEventLoop,释放之前开辟的内存,

结束进程。

中间略去一些琐碎的过程,我们总结一下

initserverconfig() ----> loadServerConfig------> daemonize()------->

initServer()-----> aeSetBeforeSleepProc()------>aeMain()----->aeDeleteEventLoop

Read more »

IO多路复用之epoll(一)讲解

Posted on 2017-08-07 | In 网络编程

网络通信中socket有自己的内核发送缓冲区和内核接受缓冲区,好比是一个水池,当用户发送数据的时候会从用户缓冲区拷贝到socket的内核发送缓冲区,然后从

socket发送缓冲区发出去, 当用户要读取数据时,就是从socket内核读缓冲区读到用户缓冲区。所以TCP中recv, send, read, write等函数并不是真的直接读写

发送报文,而是将数据分别写到socket内核缓冲区,或者从socket内核缓冲区读到用户区。

对于读有两种状态,可读和不可读,当用户从socket中读取数据的时候,如果socket读缓冲区内容为空,那么读数据会失败,阻塞情况下会等待数据到来,非阻塞情况下

会返回一个EWOULDBLOCK 或者EAGAIN,反之如果读缓冲区内容不为空,那么就会返回读到的字节数。

对于用户向socket中写数据,存在可写和不可写,如果socket写缓冲区内容满了,此时向socket写缓冲区里写数据会失败,阻塞情况下会等待socket的写缓冲区非满(有空闲空间),非阻塞情况下回返回-1,根据errono 为EWOULDBLOCK或者EAGAIN,判断写缓冲区满

反之,如果socket写缓冲区此时非满,那么写会成功,返回写入的字节数。

综上所述,对于读的情况,我们关注socket读缓冲区空还是非空,对于写的情况,我们关注

Read more »

IO多路复用之epoll(二)

Posted on 2017-08-07 | In 网络编程

前一篇介绍了epoll的LT模式,LT模式注意epollout事件在数据全部写成功后需要取消关注,或者更改为EPOLLIN。

而这次epoll的ET模式,要注意的是在读和写的过程中要在循环中写完或者读完所有数据,确保不要丢掉一些数据。

因为epoll ET模式只在两种边缘更改的时候触发,对于读事件只在内核缓冲区由空变为

非空通知一次用户,对于写事件,内核缓冲区只在由满变为非满的情况通知用户一次。

Read more »
<1…353637…41>

401 posts
18 categories
21 tags
RSS
GitHub ZhiHu
© 2026 恋恋风辰 本站总访问量次 | 本站访客数人
Powered by Hexo
|
Theme — NexT.Muse v5.1.3