汇编电话本 15pb
.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相关推荐
- 用结构体实现一个电话本
结构体是c语言又一个存储数据的类型,那么用结构体怎么实现一个简单的可以存储1000个人信息的电话本呢? 一.首先需要定义一个结构体,包含一个人的信息(比如姓名,性别,年龄,电话,住址等等).我 ...
- python程序实例电话本-利用Python电话本小程序!这波操作你给几分?
原标题:利用Python电话本小程序!这波操作你给几分? 最近比较忙,只能抽空的写写文章,其实我也是一个上班族,python完全是个人想学然后希望以后对工作有所帮助,2019年了,祝大家新年快乐. 2 ...
- python程序实例电话本-Python示例
本例是Python基础示例.涉及Python基础,包括语法.字典型数据结构.类.引入库.pickle实现的存储器.异常处理等. 示例是一个电话本.可以对电话本进行增加.删除.修改.获取列表和获取单人的 ...
- C#中教你一步步实现一个电话本窗体程序
场景 使用C#窗体程序实现一个电话本应用程序. 实现 新建窗体程序,PhoneBook 然后打开工具箱,拖拽一个ListView到窗体中 拖拽完成后点击右上角三角符号,编辑选项--编辑列. 点击添加, ...
- MTK优美代码赏析6:电话本里的快速排序和插入排序算法
MTK优美代码赏析6:电话本里的快速排序和插入排序算法 记得读书的时候学数据结构和一些程序基础的课程,学了很多的排序算法,当时感觉蛮有趣,也很简单,当大学的教育是以理论为主的,哪些教授们又没给咱举个实 ...
- 单链表的应用(电话本)
单链表 单链表的定义就不说了, 很简单, 请自行百度; 那么从今天的主题<单链表的应用>入手; 利用单链表实现电话本的模拟程序:定义单链表的数据类型,将头插法和尾插法.插入.逆置.删除.查 ...
- 顺序表的应用__电话本
顺序表的建立及使用 顺序表: 就所谓的数组式操作 编程实现顺序存储结构中的基本操作的实现(电话本的建立.插入.删除.修改.逆置.查找.输出) 整个操作过于简陋, 只对上述功能做叙述, 采用结构体数组实 ...
- Python电话本系统(添加、修改、删除、查询)
Phone Book电话本 phone_book = {} while True:print("欢迎使用电话本管理程序,请选择你要执行的功能:")print("1.添加联 ...
- 小米畅聊也将瞄准镜对向微信电话本
早在10月份,小米已经让少量用户秘密测试"小米畅聊".最近小米刚刚获得了虚拟运营商牌照,小米畅聊推出在即,镜头瞄向微信电话本.小米畅聊原本应该先于微信电话本发布的,可虚拟运营商牌照 ...
最新文章
- 满屋研选获1亿元B轮融资,华创资本领投,五岳资本、金地集团、治平资本等跟投...
- 《如何高效学习》读书笔记(一)——整体性学习策略
- HBASE 2.2.6 永久REGION IN TRANSITION 异常解决
- boost::pointer_traits的用法实例
- python和c#交互_python与C#的互相调用
- python绝对值函数fabs_Python fabs() 函数
- 60套漂亮的的免费 PSD 界面设计元素包资源(系列二)
- #研发解决方案#大数据协作平台魔盒——日拱一卒,功不唐捐
- Laravel 的闪存数据(Flash Data)
- [BZOJ2144]跳跳棋
- 今天起,上海用户可以用滴滴App免费打无人车了
- 基本回路系统和基本割集系统
- Linux学习整理-网络防火墙iptables-实践篇1
- 12[红+绿+蓝+Alpha]
- 原理解析!腾讯3轮面试都问了Android事件分发,已整理成文档
- Mysql复制表两种方式(复制表结构、复制表结构和数据、复制表中的部分数据、复制表中的部分数据并起别名)
- 【leetcode】脑子打结的题
- 《笔记——机器学习与物理模型》by鄂维南院士讲座
- 伪原创是可以变为新文章的方法
- 加利福尼亚大学研究报告:让AI自我怀疑以防人类被颠覆