汇编-实现基本链表


mAlloc proc nSize:dword

add nSize,4
invoke GlobalAlloc,GMEM_ZEROINIT or GMEM_FIXED,nSize

.if eax==0
invoke MessageBox,NULL,0,NULL,MB_OK
.endif

ret
mAlloc endp

init_L proc _struct1
LOCAL _headaddress
invoke mAlloc,sizeof _struct
mov _headaddress,eax
assume eax:ptr _struct
mov [eax].address,eax

assume eax:NOTHING
mov eax,_headaddress
ret
init_L endp
getdata_L proc _L,_i

xor ecx,ecx
mov eax,_L
.while ecx<=65536
assume eax:ptr _struct
.if ecx==_i
mov eax,eax
.break
ret
.endif

mov eax,[eax].next
inc ecx

.endw
ret

getdata_L endp

insert_L proc _L,_i
LOCAL _firstaddress
LOCAL _posaddress

mov eax,_L
mov _firstaddress,eax
xor ecx,ecx
.while ecx<_i
push ecx
assume eax:ptr _struct
invoke mAlloc,sizeof _struct
mov _posaddress,eax
mov [eax].address,eax
m2m [eax].back,_firstaddress
mov eax,_firstaddress
m2m [eax].next,_posaddress
m2m _firstaddress,_posaddress

pop ecx

inc ecx
.endw

mov eax,_L
ret
insert_L endp
delete_L proc _L,_i
LOCAL _address
mov eax,_L
xor ecx,ecx
.while ecx<65536
push ecx

assume eax:ptr _struct
.if ecx==_i

m2m _address,[eax].next
mov eax,[eax].back
m2m [eax].next,_address
.break
ret
.endif
mov eax,[eax].next

pop ecx
inc ecx
.endw
ret

delete_L endp

汇编-实现基本链表

时间: 2024-08-07 18:23:35

汇编-实现基本链表的相关文章

AT&amp;T汇编语言与GCC内嵌汇编,Linux内核数据结构之链表

最近在看<Linux内核源代码情景分析>,作者毛德操.书中刚开始介绍了AT&T汇编语言与GCC内嵌汇编,以及Linux内核数据结构之链表.可惜书中介绍的不够全面.因为推荐大家阅读下面两篇文章.很不错. AT&T汇编语言与GCC内嵌汇编:http://grid.hust.edu.cn/zyshao/Teaching_Material/OSEngineering/Chapter2.pdf. Linux内核数据结构之链表:http://www.cnblogs.com/Anker/p/

链表笔试题汇编(二)

题目:输入一个链表输出其倒数第k个结点. 参考代码: LinkList *FindktoTail(LinkList *pHead,unsigned int k) { LinkList *L1=pHead; LinkList *L2=NULL; unsigned int i=0; if(pHead==NULL || k==0 ) { return NULL; } for(i=0 ; i<k-1; i++) { if(L1->next!=NULL) {     L1=L1->next; }

链表笔试题汇编(四)

题目:合并两个有序链表. 递归实现参考代码: LinkList *Merge(LinkList *pHead1,LinkList *pHead2) { if(pHead1==NULL) { return pHead2; } else if(pHead2==NULL) { return pHead1; } LinkList *pNewMergeHead=NULL; if((pHead1->data) < (pHead2->data)) { pNewMergeHead=pHead1; pNe

链表笔试题汇编(一)

题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 分析:删除结点可以从链表的头结点开始顺序遍历,发现某个结点的next指向要删除的结点时,将该结点的next指向要删除的下一个结点.但是基于这种思路,得到的时间复杂度是O(n). 删除结点只是让这个结点不出现在该链表中,可以采取覆盖的方式.也就是将下一个结点的内容复制到需要删除的结点上覆盖掉原有的内容.这样的话,就可以达到要求了. NOTE:若要删除的结点为尾节点,我们仍要从头遍历该链表.     若只有一个结点时,

开窍小老虎,一步一个脚印之 初识汇编(二)

汇编语言,有三类指令组成: 1:汇编指令,机器码的助记符,有对应的机器码 2:伪指令:没有对应的机器码,由编译器执行,计算机并不执行 3:其他符号:如+ -等,由编译器识别,没有对应的机器码. 内存: 内存被分为若干个存储单元,一个存储单元存储8个bit,也就是一个byte.每个存储单元从0开始编号,如果一个存储器有128个存储单元,编号从0~127,他的容量是128个字节.现在我的内存是6G,=6*1024*1024个字节.这个编号可以看做是存储单元在存储器中的地址.就像一条街,每个房子都有门

C编译器剖析_6.3.1 汇编代码生成_由中间指令产生汇编代码的主要流程

6.3.1  由中间指令产生汇编代码的主要流程 在这一小节,我们可把关注的焦点放在"如何把某条中间代码翻译成汇编代码"上.UCC编译器的中间代码是如下所示的四元式,包括运算符和3个操作数. <运算符opcode,目的操作数DST,源操作数SRC1,源操作数SRC2> 当然有些中间代码只需要用到opcode和DST就可以了,例如,无条件跳转指令"goto  BB2;"就不需要SRC1和SRC2.为了便于汇编代码的生成,UCC编译器在ucl\X86Linux

C编译器剖析_6.1 汇编代码生成_简介

6.1 汇编代码生成简介 历经词法分析.语法分析.语义检查和中间代码生成阶段,我们终于来到了"目标代码生成阶段",由于UCC编译器的目标代码即为32位x86汇编代码,因此我们就把本章称为"汇编代码生成".UCC编译器中的大部分源代码都适用于Windows和Linux平台,但Windows平台上缺省的汇编器支持Intel风格的x86汇编代码,而Linux平台默认的汇编器则采用AT&T风格的x86汇编代码,两者在汇编语法上有一些差别,为节省篇幅,我们主要针对Li

链表的艺术——Linux内核链表分析

引言: 链表是数据结构中的重要成员之中的一个.因为其结构简单且动态插入.删除节点用时少的长处,链表在开发中的应用场景许多.仅次于数组(越简单应用越广). 可是.正如其长处一样,链表的缺点也是显而易见的.这里当然不是指随机存取那些东西,而是因为链表的构造方法(在一个结构体中套入其同类型指针)使得链表本身的逻辑操作(如添加结点,删除结点,查询结点等),往往与其应用场景中的业务数据相互混杂.这导致我们每次使用链表都要进行手工打造,做过链表的人肯定对此深有了解. 是否能将链表从变换莫測的业务数据中抽象出

C编译器剖析_6.2 汇编代码生成_寄存器的管理

在计算机中,CPU的速度比内存的速度快得多,编译器应尽量有效地利用寄存器资源,减少对内存的不必要访问,从而提高由编译器生成的汇编代码的运行速度.在中间代码生成阶段,UCC编译器用临时变量t来存放形如"t: a+b;"的公共子表达式的值:到了汇编代码生成时,UCC编译器会尽可能地把这些公共子表达式的值存放在寄存器,当需要再次重用时,就可以直接由相应的寄存器中得到.不过,CPU中寄存器的资源是很有限的,在32位的x86 芯片上,汇编程序员可用的寄存器有{eax,ebx, ecx,edx,