摘要: 把后缀表达式转变成表达树,然后再后序遍历表达数,把后序遍历后的结果输出。这里,要配合两种数据结构,第一就是栈,第二就是二叉树。所以,我把这些不同的数据结构分别放进不同的.c文件作为不同的模块,还有一个模块是核心模块,就是把后缀表达式转变成表达树的功能。最后,main.c里面存放的只是测试代码。栈的头文件:stack.h栈的实现函数:stack.c二叉树的头文件:btree.h二叉树实现文件:btr... 阅读全文
posted @ 2010-10-23 17:20 Linjian 阅读(477) 评论(0) 推荐(0) 编辑
摘要: 循环队列的数组实现:queue.hqueue.cqueue.c 阅读全文
posted @ 2010-10-23 13:17 Linjian 阅读(948) 评论(0) 推荐(1) 编辑
摘要: 国庆后工作很忙,没什么时间看自己的书了。晚上看数据结构,写一个中缀表达式转换成后缀再进行计算的小程序。中缀转换成后缀的核心代码我没花心思去简化逻辑了,该睡觉了。其中,栈是用数组来实现的。栈的头文件说明:stack.h栈的实现代码:[代码]main.c: 中缀转换为后缀,再进行计算的代码:[代码]测试结果:代码 阅读全文
posted @ 2010-10-23 01:14 Linjian 阅读(633) 评论(0) 推荐(0) 编辑
摘要: 1. 可以修改IP,或者同时修改CS和IP的指令称为转移指令。有两种类型转移:1)只修改IP是段内转移,如:jmp ax2)修改CS和IP是段间转移,如:jmp 1000:02. 操作符offset:offset是取得标号的偏移地址,例如:start: mov ax, offset start  ; equal to : mov ax, 03. jmp称为无条件转移,可以只修改IP,也可以同时修改... 阅读全文
posted @ 2010-09-27 21:03 Linjian 阅读(280) 评论(0) 推荐(0) 编辑
摘要: 今天发现了一个很傻的设计,来自北京公司的不知哪位大哥写的:  POS上的三种通讯方式:GPRS, TCP/IP, Modem。POS是一个终端,一般来说进行交易是不止一个主机的。不同主机进行交易的通讯方式可能不一样。于是,你必须通过代码来选择通讯方式,我看了代码,发现有几个地方巨傻:  第一、GPRS本来就写好的,成为一个独立文件。理论上讲,应该是TCP/IP, Modem也各成两个独立的文件,或... 阅读全文
posted @ 2010-09-27 14:17 Linjian 阅读(235) 评论(0) 推荐(0) 编辑
摘要: 1. 8086CPU处理数据的两个基本问题:1)处理的数据存放在哪个地方?2)要处理的数据有多长?2. bx, si, di, bp:这四个寄存器,都可以放在"[...]"来进行内存单元的寻址,其他寄存器都不可以,就是这么规定的,例如:mov ax, [bx]; mov ax, [si]; mov ax, [di+bp]; mov ax, [bp]; 都是合法的;但是:mov ax, [dx]; ... 阅读全文
posted @ 2010-09-27 00:26 Linjian 阅读(229) 评论(0) 推荐(0) 编辑
摘要: 1. 以字符形式给出的数据:在汇编程序中,以'...'方式指明的数据是以字符形式给出的,编译器把它们转化为响应的ASCII码。[代码]2. 大小写转换的问题:大小写字母的二进制码其实只有第5个bit(从0开始算起)是不同的,小写的字母第5个bit总是为1,而大写的总是为0. 所以,转换大小写无需判断字母是大写还是小写。and和or指令按位进行与或者或计算。下面是把字符串中的每个字符都转换成小写字母... 阅读全文
posted @ 2010-09-26 19:31 Linjian 阅读(342) 评论(0) 推荐(0) 编辑
摘要: 1. 先考虑这样一个问题:计算以下8个数据的和,结果存放在寄存器ax中:0123h 0456h 0789h 0abch 0defh 0fedh 0cbah 0987h毫无疑问,要累加这些数据,就必须把这些数据先存放在内存单元中,然后循环读取每一个数据,进行累加。从何找到这段连续的内容单元?一般来说,我们无法自己决定使用哪段内存空间,所以把这个任务交给操作系统自己来决定:代码在上面的例子中,dw的意... 阅读全文
posted @ 2010-09-25 21:41 Linjian 阅读(781) 评论(0) 推荐(0) 编辑
摘要: 1. [bx]:[0]表示一个内存单元,其地址为:ds:0。同样道理,[bx]也是表示一个内存单元,偏移地址在寄存器bx中。比如:mov ax, [bx]:bx中存放的数据作为偏移地址,把一个内存单元送入ax中。mov [bx], ax:跟上面一样道理,只是把ax的内容送入内存单元[bx]中。2. Loop指令:Loop指令用于循环,其执行分为两个步骤进行:1) (cx) = (cx) - 1;(... 阅读全文
posted @ 2010-09-25 00:42 Linjian 阅读(568) 评论(0) 推荐(0) 编辑
摘要: 1. 程序执行流程:简单说下,编写汇编程序->对程序进行编译和链接(注意,是两个动作)->执行可执行文件。操作系统将依照可执行文件中的描述信息,将可执行文件中的机器码和数据加载入内存,并进行相关的初始化,然后由CPU执行。2. 源程序:先来看看教材中第一个程序:[代码]1) 伪指令:汇编程序中包含两种指令,第一是伪指令,第二是汇编指令。区别在于:汇编指令是有对应的机器码的指令,可以被编... 阅读全文
posted @ 2010-09-24 15:48 Linjian 阅读(1006) 评论(0) 推荐(1) 编辑
摘要: 1. DS和[address]:8086CPU中寻址是用段地址×16+偏移地址来实现的。8086CPU有一个DS寄存器,通常用来存放要访问数据的段地址。而偏移地址则由[address]来决定。举例:mov bx, 1000Hmov ds, bxmov al, [0]表示寻址到1000:0,把该字节送给寄存器al。注意,不能直接用:mov ds, 1000H。这是硬件上的设计。2. 数据... 阅读全文
posted @ 2010-09-24 11:29 Linjian 阅读(841) 评论(0) 推荐(0) 编辑
摘要: CPU中的主要部件是寄存器,寄存器是CPU中程序员可以用指令来读写的部件。通过改变各种寄存器中的内容来实现对CPU的控制。8086CPU有14个寄存器,这里不一一列举。1. 通用寄存器:8086CPU的所有寄存器都是16位的,也就是可以存放两个字节。四个通用寄存器:AX,BX,CX,DX,通常用来存放一般性的数据。一个16位的寄存器可以存放的最大数值是FFFFH。每个寄存器可分为两个可独立使用的8... 阅读全文
posted @ 2010-09-23 21:09 Linjian 阅读(783) 评论(0) 推荐(0) 编辑
摘要: 写点摘要,来自王爽老师那本《汇编语言》,以前大二的时候看过一次,复习一下。1、存储器:也就是我们平常所说的内存,指令和数据都是存放在存储器当中。2、指令和数据:都存储在存储器中。注意,两者只是应用上的概念,其实在存储器中,两者都是以二进制存放的,对于计算机来说,没有区别。3、存储单元:存储器被分成若干个存储单元,每个存储单元从0开始编号,一个存储单元是8个bit,也就是1byte。4、CPU对存储... 阅读全文
posted @ 2010-09-23 17:45 Linjian 阅读(256) 评论(0) 推荐(0) 编辑
摘要: 最近总是感觉没有什么胃口,大餐也吃了不少,山珍海味也提不起我的兴趣,吃饭似乎就成了任务一般,总是不知道自己想吃什么。人也就瘦了下来,身体便自然处于所谓的亚健康状态。  我记得我大学的时候也有好几次出现这种状态,也是不想吃饭,连双腿都懒得移动了。仔细想了一番,经验中,不想吃饭有两种情况:一是这段时间你专注在某一件事上,导致你不想做其他事,甚至连吃饭都不行;二是你百无聊赖,直接导致你没有胃口。我大学的... 阅读全文
posted @ 2010-09-22 11:31 Linjian 阅读(166) 评论(0) 推荐(0) 编辑
摘要: 花了几天时间,我完成了一个静态库。昨天我决定把提供三个接口给应用程序调用,这三个接口其实有着业务流程上的顺序关系,即应用程序必须按照这样的调用顺序:A->B->C。我之所以提供三个接口,而不是抽象为一个,那是因为有些应用程序只需要执行到B这一步就可以满足需求了,而大部分应用程序则需要执行到C这一步才能完成其功能;提供了三个API,让应用程序的选择更加灵活,这是第一个原因;第二个原因,是... 阅读全文
posted @ 2010-09-21 22:20 Linjian 阅读(1524) 评论(0) 推荐(0) 编辑