.386
.model flat,stdcall
option casemap:noneinclude msvcrt.inc
includelib msvcrt.lib
include user32.inc
includelib user32.lib
include windows.inc
include kernel32.inc
includelib kernel32.lib.data
; 暂停
str_system_pause db "pause", 0dh, 0ah, 0
; 用于保存菜单的选项
choose dd 0
; 用于存储跳转表的数据
; 跳转表,保存 case 块的地址
jmp_table dd case1, case2, case3, case4,case5,case6
;定义结构体
CONTACTSSTRUCT structszName BYTE 25 dup(0) ;nameszPhNmuber BYTE 12 dup(0) ;phone number
CONTACTSSTRUCT endsPCONTACTSSTRUCT TYPEDEF PTR CONTACTSSTRUCT ;取别名,指针类型g_stContacts CONTACTSSTRUCT 100 dup(<'0'>) ;定义结构体数组
g_nCount DWORD 0    ;元素个数
g_nMaxCount DWORD 100   ;MAX元素个数
g_strTemContacts CONTACTSSTRUCT <'0','0'>  ;接收输入信息;定义格式控制符,用于输入输出时用到的格式控制符
g_szScanfFormat BYTE '%s %s',0h
g_szScanfName BYTE '%s',0h
g_szScanfByte BYTE '%c',0h
.const ;常量数据
sz_put_name db "请输入要添加的用户名,密码:",0h
sz_find_name db "请输入要查找的用户名:",0h
sz_change_name db "请输入要修改的name",0h
sz_remove_name db "请输入要删除的name",0h
sz_put_number db"please enter a number",0h
g_szOK db"删除OK",0h
; 清空屏幕
str_printf_size db "超出容量", 0dh, 0ah, 0
; 格式控制符
str_format_int db "%d", 0
; 菜单项
str_show_menu db "1. 添加数据", 0dh, 0ah,"2. 显示数据", 0dh, 0ah,"3. 查找数据", 0dh, 0ah,"4. 删除数据", 0dh, 0ah,"5. 修改数据", 0dh, 0ah,"6. 退出程序", 0dh, 0ah,"请输入选项: ", 0; 0dh 0ah == \r\n 0 字符串结尾
;tr_show_menu db "1.添加数据",
.code; 清空屏幕
str_system_cls db "cls", 0
GET_CHAR PROCpush eaxpush offset g_szScanfByte;%ccall crt_scanfadd esp,8hretGET_CHAR endp
ADD_USER proc   ;无参数lea eax,sz_put_namepush eax ;提示输入名字call crt_printf      ;打印sz_put_nameadd esp,4h ;平衡参数  ;平衡xor eax,eaxxor ecx,ecx   ;cmp ecx,[g_nMaxCount]  ;判断是否超过最大容量lea esi,[g_stContacts] mov ecx,g_nCount  ;获取已存放信息个数mov eax,sizeof(CONTACTSSTRUCT) imul eax,ecxadd esi,eax;数组大小,乘以 countlea edx,[esi+CONTACTSSTRUCT.szName]lea eax,[esi+CONTACTSSTRUCT.szPhNmuber]push eaxpush edx;push eaxpush offset g_szScanfFormatcall crt_scanfadd esp,12inc g_nCount ;++retADD_USER endp
;---------------------------------
FindData procxor ecx,ecxxor eax,eaxxor ebx,ebx;1.输入数据lea eax,sz_put_namepush eax    ;提示输入名字call crt_printf      ;打印sz_put_nameadd esp,4h ;平衡参数  ;平衡lea edi,[g_strTemContacts.szName]push edipush offset g_szScanfNamecall crt_scanfadd esp,8;2.开始查询mov ecx,0CYCLE_MARK:cmp ecx,g_nCountjz Exit_cycle;2.1根据ecx的值,找到下一个结构体的名字数组的地址lea esi,[g_stContacts]          ;源串lea edi,[g_strTemContacts.szName]    ;用于比较的字符串mov eax,sizeof(CONTACTSSTRUCT)imul eax,ecxadd esi,eax;2.2比较字符串mov eax,ecx  ;保存了循环次数,当前循环了第几次了mov ecx,6     ;初始化字符串,因为是25个字节,但末尾是0,而用dword4字节,4*6  24repe cmpsd dword ptr[esi],dword ptr[edi]je CARRIEDOUT_MARKmov ecx,eaxINC ECX       ;自增jmp CYCLE_MARKCARRIEDOUT_MARK:;输出信息mov ecx,eaxlea esi,[g_stContacts]mov ebx,sizeof(CONTACTSSTRUCT)imul ebx,ecxadd esi,ebxlea eax,[esi+CONTACTSSTRUCT.szPhNmuber]push eaxpush offset g_szScanfNamecall crt_printfadd esp,8
Exit_cycle:retFindData endp
;修改用户信息
CHANGE PROC;1.输入信息push offset sz_change_namecall crt_printfadd esp,4lea edi,[g_strTemContacts.szName]push edipush offset g_szScanfNamecall crt_scanfadd esp,8;2.开始查询mov ecx,0CYCLE_MARK:cmp ecx,g_nCountjz Exit_cycle   ;if 找不到就退出;2.1根据ecx的值,找到下一个结构体的名字数组的地址lea esi,[g_stContacts]lea edi,[g_strTemContacts.szName]mov eax,sizeof(CONTACTSSTRUCT)imul eax,ecxadd esi,eax;2.2比较字符串mov eax,ecxmov ecx,6repe cmpsd dword ptr[esi],dword ptr[edi]je CARRIEDOUT_MARKmov ecx,eaxinc ecxjmp CYCLE_MARKCARRIEDOUT_MARK:;修改信息mov ecx,eaxlea esi,[g_stContacts]mov ebx,sizeof(CONTACTSSTRUCT)imul ebx,ecxadd esi,ebx;1.输入信息push offset sz_change_namecall crt_printfadd esp,4;1.1修改信息lea edx,[esi+CONTACTSSTRUCT.szName]lea eax,[esi+CONTACTSSTRUCT.szPhNmuber]push eaxpush edxpush offset g_szScanfFormatcall crt_scanfadd esp,12
Exit_cycle:retCHANGE endpRemoveData proc;1.输入信息push offset sz_remove_namecall crt_printfadd esp,4lea esi,[g_strTemContacts.szName]push esipush offset g_szScanfNamecall crt_scanfadd esp,8;2.循环遍历mov ecx,0CYCLE_MARK:cmp ecx,g_nCountjz Exit_cyclepush ecx  ;先push进去;2.1根据ecx的值,找到下一个结构体的名字数组的地址lea esi,[g_stContacts]          ;源串lea edi,[g_strTemContacts.szName]    ;用于比较的字符串mov eax,sizeof(CONTACTSSTRUCT)imul eax,ecxadd esi,eax;2.2比较字符串mov eax,ecx  ;保存了循环次数,当前循环了第几次了mov ecx,6     ;初始化字符串,因为是25个字节,但末尾是0,而用dword4字节,4*6  24repe cmpsd dword ptr[esi],dword ptr[edi]je CARRIEDOUT_MARKpop ecx;mov ecx,eaxINC ECX       ;自增jmp CYCLE_MARKCARRIEDOUT_MARK:;删除;将esi设置为当前要删除的结构体数组pop ecx;mov ecx,eaxlea edi,[g_stContacts]mov ebx,sizeof(CONTACTSSTRUCT)imul ebx,ecxadd edi,ebx       ;edi保存的是,当前要删除的结构体数组的首地址mov esi,edimov ebx,sizeof(CONTACTSSTRUCT)add esi,ebx        ;esi 指向要删除的结构体数组的下一个元素的首地址add ecx,eaxmov eax,g_nCountsub eax,ecxmov ebx,sizeof(CONTACTSSTRUCT)imul ebx,eaxmov ecx,ebx       ;计算need mov的字节rep movs BYTE PTR[edi],BYTE ptr [esi];开始移动(以一个字节开始移动);移动完成后删除最后一个结构体中的信息mov ebx,sizeof(CONTACTSSTRUCT)push ebxpush 0push edicall crt_memsetadd esp,12dec g_nCountpush offset g_szOKcall crt_printfadd esp,4push 2000call Sleep    ;此函数不用自己平衡栈  需要包含头文件include kernel32.inc        cludelib kernel32.lib
Exit_cycle:retRemoveData endpShowData procmov ecx,0CYCLE_MARK:cmp ecx,g_nCountjz CARRIEDOUT_MARKpush ecx;一定要在cmp下,不然在cmp前,一终止,就无法pop了;造成栈不平衡;2.依次打印lea esi,[g_stContacts]           ;源串mov eax,sizeof(CONTACTSSTRUCT)imul eax,ecxadd esi,eax;1.1输出lea edx,[esi+CONTACTSSTRUCT.szName]lea eax,[esi+CONTACTSSTRUCT.szPhNmuber]push eaxpush edxpush offset g_szScanfFormatcall crt_printfadd esp,12pop ecxinc ecxjmp CYCLE_MARKCARRIEDOUT_MARK:retShowData endp
; 函数:退出程序
exit_pragma procpush 0call crt_exitret
exit_pragma endp
main:
begin_while:; 打印菜单项: print(arg)
push offset str_show_menu
call crt_printf; crt 函数是 c 语言提供的的; 所以需要平衡堆栈 _cdecl
add esp, 4; 获取用户的输入 scanf("%d", &choose)push offset choosepush offset str_format_intcall crt_scanf; 有两个参数,需要平衡 2*4 字节add esp, 8; switch case 的实现; 1. 获取到当前输入的数据对应的[下标]
mov ecx, [choose]
dec ecx; 2. 判断下标是否在有效范围(case)之内
cmp ecx, 4; 3. 如果传入的数据不在表中,那么跳转到 default
ja default; 4. 否则查表进行跳转
jmp dword ptr [jmp_table+ecx*4]
case1:; 添加数据
call ADD_USER
jmp endswitch
case2:; 显示数据
call ShowData
jmp endswitch
case3:; 查找数据
call FindData
jmp endswitch
case4:;删除数据
call RemoveData
jmp endswitch
case5:; 修改数据
call CHANGE
jmp endswitch
case6:; 退出程序
call exit_pragma
jmp endswitch
default:; 表示输入错误,直接进入下一次循环jmp begin_whilepush 500call Sleep
endswitch:; 添加一个暂停
push offset str_system_pause
call crt_system
add esp, 4; 清空屏幕push offset str_system_clscall crt_systemadd esp, 4
jmp begin_while
;call ADD_USER
;call FindData
;   xor ecx,ecx
;   xor eax,eax
;   xor ebx,ebx
;
;   push offset g_stContacts.szName
;   call crt_printf     ;打印
;   add esp,4h
;   push offset g_stContacts.szPhNmuber
;   call crt_printf     ;打印
;   add esp,4h
;
;   call ADD_USER
;
;   xor ecx,ecx
;   xor eax,eax
;   xor ebx,ebx
;
;   lea esi,[g_stContacts]
;   ;mov ecx,g_nCount-1  代表是地址-1    mov ecx,g_nCountv相当于 取了 g_nCount的值放到ecx中
;   mov ecx,g_nCount
;   dec g_nCount    ;获取已存放信息个数
;;  sub ecx,1
;;mov ecx,2-1
;   mov eax,sizeof(CONTACTSSTRUCT)
;   imul eax,ecx
;   add esi,eax;数组大小,乘以 count
;
;   lea eax,[esi+CONTACTSSTRUCT.szName]
;
;   lea edx,[esi+CONTACTSSTRUCT.szPhNmuber]
;
;   push edx
;
;   push eax
;
;   ;push offset g_stContacts.szName
;   call crt_printf     ;打印
;   add esp,4h
;   pop edx
;   push edx
;   ;push offset g_stContacts.szName+25H
;   call crt_printf     ;打印 打印不出来的原因是因为,上一个call会改变edx中的值
;   add esp,4h
ret
end main
end

汇编电话本 15pb相关推荐

  1. 用结构体实现一个电话本

    结构体是c语言又一个存储数据的类型,那么用结构体怎么实现一个简单的可以存储1000个人信息的电话本呢?     一.首先需要定义一个结构体,包含一个人的信息(比如姓名,性别,年龄,电话,住址等等).我 ...

  2. python程序实例电话本-利用Python电话本小程序!这波操作你给几分?

    原标题:利用Python电话本小程序!这波操作你给几分? 最近比较忙,只能抽空的写写文章,其实我也是一个上班族,python完全是个人想学然后希望以后对工作有所帮助,2019年了,祝大家新年快乐. 2 ...

  3. python程序实例电话本-Python示例

    本例是Python基础示例.涉及Python基础,包括语法.字典型数据结构.类.引入库.pickle实现的存储器.异常处理等. 示例是一个电话本.可以对电话本进行增加.删除.修改.获取列表和获取单人的 ...

  4. C#中教你一步步实现一个电话本窗体程序

    场景 使用C#窗体程序实现一个电话本应用程序. 实现 新建窗体程序,PhoneBook 然后打开工具箱,拖拽一个ListView到窗体中 拖拽完成后点击右上角三角符号,编辑选项--编辑列. 点击添加, ...

  5. MTK优美代码赏析6:电话本里的快速排序和插入排序算法

    MTK优美代码赏析6:电话本里的快速排序和插入排序算法 记得读书的时候学数据结构和一些程序基础的课程,学了很多的排序算法,当时感觉蛮有趣,也很简单,当大学的教育是以理论为主的,哪些教授们又没给咱举个实 ...

  6. 单链表的应用(电话本)

    单链表 单链表的定义就不说了, 很简单, 请自行百度; 那么从今天的主题<单链表的应用>入手; 利用单链表实现电话本的模拟程序:定义单链表的数据类型,将头插法和尾插法.插入.逆置.删除.查 ...

  7. 顺序表的应用__电话本

    顺序表的建立及使用 顺序表: 就所谓的数组式操作 编程实现顺序存储结构中的基本操作的实现(电话本的建立.插入.删除.修改.逆置.查找.输出) 整个操作过于简陋, 只对上述功能做叙述, 采用结构体数组实 ...

  8. Python电话本系统(添加、修改、删除、查询)

    Phone Book电话本 phone_book = {} while True:print("欢迎使用电话本管理程序,请选择你要执行的功能:")print("1.添加联 ...

  9. 小米畅聊也将瞄准镜对向微信电话本

    早在10月份,小米已经让少量用户秘密测试"小米畅聊".最近小米刚刚获得了虚拟运营商牌照,小米畅聊推出在即,镜头瞄向微信电话本.小米畅聊原本应该先于微信电话本发布的,可虚拟运营商牌照 ...

最新文章

  1. 满屋研选获1亿元B轮融资,华创资本领投,五岳资本、金地集团、治平资本等跟投...
  2. 《如何高效学习》读书笔记(一)——整体性学习策略
  3. HBASE 2.2.6 永久REGION IN TRANSITION 异常解决
  4. boost::pointer_traits的用法实例
  5. python和c#交互_python与C#的互相调用
  6. python绝对值函数fabs_Python fabs() 函数
  7. 60套漂亮的的免费 PSD 界面设计元素包资源(系列二)
  8. #研发解决方案#大数据协作平台魔盒——日拱一卒,功不唐捐
  9. Laravel 的闪存数据(Flash Data)
  10. [BZOJ2144]跳跳棋
  11. 今天起,上海用户可以用滴滴App免费打无人车了
  12. 基本回路系统和基本割集系统
  13. Linux学习整理-网络防火墙iptables-实践篇1
  14. 12[红+绿+蓝+Alpha]
  15. 原理解析!腾讯3轮面试都问了Android事件分发,已整理成文档
  16. Mysql复制表两种方式(复制表结构、复制表结构和数据、复制表中的部分数据、复制表中的部分数据并起别名)
  17. 【leetcode】脑子打结的题
  18. 《笔记——机器学习与物理模型》by鄂维南院士讲座
  19. 伪原创是可以变为新文章的方法
  20. 加利福尼亚大学研究报告:让AI自我怀疑以防人类被颠覆

热门文章

  1. git删除本地分支、删除远程分支
  2. 在 Kubernetes 上部署 Fluent Bit 收集日志发送到 Kafka
  3. 十句冥思話--人生感悟
  4. AXI总线核心解读---基于官方文档
  5. == 和 equal
  6. python错误类型翻译_17个新手常见的Python运行时错误
  7. Python实现秒杀某宝商品抢购(附超详细代码)
  8. 外呼系统在电销行业越来越受欢迎,它有什么用?
  9. Mac下修复Node版本不正确的问题
  10. Transaction silently rolled back because it has been marked as rollback-only