汇编代码转换程序(字母转换,进制转换)_第1页
汇编代码转换程序(字母转换,进制转换)_第2页
汇编代码转换程序(字母转换,进制转换)_第3页
汇编代码转换程序(字母转换,进制转换)_第4页
汇编代码转换程序(字母转换,进制转换)_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

湖湖南南农农业业大大学学课课程程设设计计报报告告 学 院 信息科学技术学院 班 级 2010 级计算机 3 班 姓 名 杨田娇 学 号 201041842312 课程设计题目 代码转换程序设计 课程名称 汇编语言与微机原理 指导老师 唐小勇 评阅成绩 评阅意见 成绩评定教师签名 日期 年 月 日 目目 录录 概述 1 一 设计题目 1 二 设计内容与要求 1 三 设计思想 1 四 程序流程图 3 五 程序源代码 5 六 设计过程中遇到的问题及解决方法 14 七 设计心得 15 代码转换程序设计代码转换程序设计 概述 概述 代码转换程序主要是实现字母间的转换和数值之间的转换 其中字母转换是大小写 字母之间的互换 二进制转换则是二进制 十进制 十六进制之间的转换 程序设计成一 个代码转换系统 给出一个可供选择的菜单 根据界面的信息选择不同的子功能 通过做 这个程序 加强汇编语言编程的能力 更好的了解其基本原理 基本的思想 基本的方法 以及相关的注意事项 1 设计题目设计题目 代码转换程序设计 2 设计内容与要求设计内容与要求 完成一个字母或数制之间的转化程序 主程序分别具有 5 种可选择的子功能 按 相应的字符可分别进入相应的子功能并在屏幕上显示结果 按 q 键退出 5 种可选择的 子功能分别为 1 实现小写字母向大写字母的转换 2 实现大写字母向小写字母的转换 3 实现二进制数向十六进制数的转换 4 实现十六进制数向二进制数的转换 5 实现十六进制数向十进制数的转换 3 设计思想设计思想 运行程序 首先会显示主界面 用户可依据提示选择不同的编号 实现不同的子功 能 1 大写字母向小写字母的转换 当用户选择编号 a 便选中了这一个子功能 通 过判断标识符 程序跳转到标识符所在的位置 根据提示输入一个大写字母 会有一个判 断输入是否合法的过程 若输入的是非大写字母 则会提示输入错误 请重新输入 直到 输入正确为止 通过改变 assic 码值 实现大写字母向小写字母的转换 显示转换后的字 母 然后跳转到主菜单 2 小写字母向大写字母的转换 当用户选择编号 b 便选择了这一个子功能 通过 判断标识符 程序跳转到标识符所在的位置 根据提示输入一个小写字母 接下来判断其 合法性 若输入的字母是非小写字母 则会提示输入错误 请重新输入 直到输入正确为 止 通过改变 assic 码值 实现小写字母向大写字母的转换 显示转换后的字母后 跳转 到主菜单 3 二进制向十六进制的转换 当用户选择编号 c 便选择了这一个子功能 通过 判断标识符 程序跳转到标识符所在的位置 根据提示首先输入一个数字表示二进制的位 数 在程序中有变量记录二进制的位数 再根据提示输入一个二进制数 其转换的主要思 想是 二进制数的每四位代表十六进制的 通过移位来逐一将四个二进制位数的和转换成十六进 制数保存在一个寄存器中 然后再继续按照每四位一求和的方法保存十六进制数的每一位 直到二进制数的所有位计算完毕 当对四位二进制数相加完毕后 将保存和的寄存器清零 采用相对寻址改变十六进制数每一位存放的位置 其中还会对十六进制每一位上的数字进 行判断 若是大于 9 则转换成相应的字母 最后采用相对寻址的方式将十六进制的每一 位依次输出 显示完毕后 跳转到主菜单 4 十六进制向二进制的转换 当用户选择编号 d 便选择了这一个子功能 通过判 断标识符 程序跳转到标识符所在的位置 根据提示输入一个十六进制数 此时会进行判 断 判断输入的字符串是否符合十六进制数的要求 若是输入错误 则提示输入错误 重 新输入 直到输入正确为止 其转换的主要思想是通过转换成十进制 然后将十进制数转 换成二进制 在十六进制转换成十进制中 按权值展开再相加的思想 在十进制转换成二进制的中 主 要是采用连除的方法 将每一次的余数保存在堆栈中 直到商为零 最后出栈 根据栈的 先进后出的原则 出栈的顺序就是转换后的二进制数的顺序 将转换后的二进制数输出后 跳转到主菜单 5 十六进制向十进制的转换 当用户选择编号 e 便选择了这一个子功能 通过 判断标识符 程序跳转到标识符所在的位置 根据提示输入一个十六进制数 此时会进行 判断 若是输入字符串不符合十六进制数的要求 则提示输入错误 重新输入 直到输入 正确为止 十六进制数转换成十进制的主要思想是 按权值展开再相加 首先是将输入的 字符转换成相应的数字 通过设置相应的变量 在最低位上的权值是 1 然后依次是 16 256 依次进行累乘 直到十六进制数位数全部循环完毕 将每一位所得的数保存在 寄存器中 每进行一次就实现一次求和运算 最后将转换成的十进制数输出 跳转到主菜 单 6 退出 当用户选择编号 q 便选择了退出 通过判断标识符 程序跳转到标识 符所在的位置 实现退出 4 程序流程图程序流程图 其他 abcdeq N N NN Y YYY d 开 始 主菜单 用户 选择子功能 输入有误 重新输入 输入 大写 字母 判断 输入 是否 合法 输入 错误 转 换 输 出 输入 小字 母写 判断 输入 是否 合法 输入 错误 转 换 输 出 输入 二进 制数 判断 输入 是否 合法 输入 错误 输 出 输入 十六 进制 数 判断 输入 是否 合法 输入 错误 转 换 转换 十进 制 判断子 功能 转换二 进制数 输 出 退出 结 束 e 附图 图 1 编译显示的主菜单 输 出 图 2 各个子功能显示 5 程序源代码程序源代码 include io32 inc data m1 byte 代码转换系统 13 10 0 菜单 m2 byte 13 10 0 分割 线 m3 byte 编号 操作 13 10 0 ma byte a 实现大写字母向小写字母的转换 13 10 0 mb byte b 实现小写字母向大写字母的转换 13 10 0 mc byte c 实现二进制向十六进制数的转换 13 10 0 md byte d 实现十六进制向二进制数的转换 13 10 0 me byte e 实现十六进制向十进制数的转换 13 10 0 mq byte q 退出 13 10 0 m err byte 输入错误 请重新输入 13 10 0 m meau byte 请输入菜单中的编号 0 m inputs byte 请输入一个小写字母 0 m inputl byte 请输入一个大写字母 0 m outputl byte 对应的小写字母 0 m outputs byte 对应的大写字母 0 m input1 byte 请输入二进制位数 0 m input11 byte 请输入二进制数 0 m output1 byte 转换后的十六进制数 0 m output2 byte 转换后的二进制数 0 m input3 byte 请输入一个十六进制数 0 m output3 byte 转换后的十进制数 0 array byte 8 dup 0 用字符串数组保存十六进制数 sum dword 十进制数变量 len byte 字符串数组的长度 m byte array1 byte 100 dup 0 定义一个数组用来保存初始二进制数 array2 byte 100 dup 0 用来保存转换后的十六进制数 n dword k dword j dword code start mov eax offset m1 显示菜单中的内容 call dispmsg mov eax offset m2 call dispmsg mov eax offset m3 call dispmsg mov eax offset ma call dispmsg mov eax offset mb call dispmsg mov eax offset mc call dispmsg mov eax offset md call dispmsg mov eax offset me call dispmsg mov eax offset mq call dispmsg meau mov eax offset m meau call dispmsg 提示输入相应的菜单编号 call readc 输入对应的编号 call dispcrlf 换行 cmp al a 判断输入 jz a 若输入 a 则跳转到标识符 a cmp al b jz b 若输入 b 则跳转到标识符 b cmp al c jz cc 若输入 c 则跳转到标识符 cc cmp al d jz e 若输入 d 则跳转到标识符 e cmp al e jz e 若输入 e 则跳转到标识符 e cmp al q jz q 若输入 q 则跳转到标识符 q mov eax offset m err call dispmsg 输入错误 提示错误的信息 jmp meau 大写字母向小写字母的转换 returna mov eax offset m err call dispmsg a mov eax offset m inputl call dispmsg 提示输入一个大写的字母 call readc 获得字母 mov bl al 将输入的内容存储到 bl 中 call dispcrlf 换行 cmp al A 判断输入的字母是否合法 jb returna 如果比 A 小 则跳转到 returna 标识符 cmp al Z ja returna 如果比 Z 大 则跳转到 returna 标识符 call dispc 显示字母 mov eax offset m outputl call dispmsg 输入正确 则提示输出相应的小写字母 add bl 20h 实现大写向小写的转换 mov al bl call dispc 显示转换后的字母 call dispcrlf 换行 jmp meau 小写字母向大写字母的转换 returnb mov eax offset m err call dispmsg b mov eax offset m inputs call dispmsg 提示输入一个小写字母 call readc 获得字母 mov bl al 将输入的内容存储到 bl 中 call dispcrlf cmp al a 判断输入合法性 jb returnb 如果比 a 小 则跳转到 returnb 标识符 cmp al z ja returnb 如果比 z 大 则跳转到 returnb 标识符 call dispc 显示字母 mov eax offset m outputs call dispmsg 提示输出相应的大写字母 sub bl 20h 实现小写到大写字母的转换 mov al bl call dispc 将转换的字母输出 call dispcrlf 换行 jmp meau 二进制向十六进制转换 cc mov eax offset m input1 call dispmsg call readuid 输入二进制数的位数 mov j eax 保存二进制位数 mov eax offset m input11 提示输入二进制数 call dispmsg call dispcrlf mov ecx 0 清零 计数器 c1 call readuid mov array1 ecx al 一位一位的输入 inc ecx cmp ecx j jb c1 低于位数 继续输入 mov ecx j dec ecx mov eax 1 xor ebx ebx 记录移动的位数 xor edx edx 表示四个二进制位的和 xor esi esi 保存十六进制当前的位置 c2 mov n 0 n 作为二进制位数是否已达 4 位的一个标志 mov k 0 k 作为数值是否已经结束的一个标志 cmp array1 ecx 1 jnz c11 判断二进制数的某一位是否为 1 mov eax 1 cmp ebx 1 jnz c3 判断数据所在的位数 不相等 转向 c3 shl eax 1 逻辑左移 jmp c5 c3 cmp ebx 2 jnz c4 根据比较来确定移动的位数 shl eax 2 逻辑左移 jmp c5 c4 cmp ebx 3 jnz c5 根据比较来判断移动的位数 shl eax 3 逻辑左移 c5 add edx eax 保存和 c11 cmp ebx 3 判断二进制数是否已经有四位 jnz c12 mov n 1 c12 cmp ecx 0 判断数值是否已经全部计算完毕 jnz c13 mov k 1 c13 mov edi n or edi k 保存 n 或者 k 的值 cmp edi 1 jnz c16 cmp edx 9 jna c14 sub edx 10 edx 大于 9 add edx A 转换成相应的字母 mov array2 esi dl 将十六进制数保存至数组 jmp c15 c14 add edx 0 mov array2 esi dl edx 大于等于 0 小于等于 9 c15 inc esi 改变当前十六进制数所在位置 xor edx edx 清零以便下一次运用 mov ebx 1 c16 inc ebx dec ecx cmp ecx 0 jnl c2 小于 0 退出循环 mov eax offset m output1 call dispmsg mov ecx esi 16 进制数的位数 dec ecx ccc mov al array2 ecx call dispc 输出每一个十六进制数 dec ecx cmp ecx 0 输出转换后的数据 jnl ccc call dispcrlf jmp meau 返回主菜单 十六进制向二进制的转换 d mov eax 20 push eax 将 20 作为一个判断标识 mov eax sum 将十进制数存入 eax 中 jmp d1 d1 mov edx 0 mov ebx 2 除数 2 div ebx mov ecx eax 保存商 mov eax edx push eax 将余数压入栈 mov eax ecx cmp eax 0 判断商是否为 0 jz d2 jmp d1 d2 mov ecx eax 暂存 mov eax offset m output2 call dispmsg mov eax ecx jmp d3 d3 pop eax 出栈 cmp eax 20 jz d4 判断是否出栈完毕 call dispsid jmp d3 d4 call dispcrlf jmp meau 返回主菜单 十六进制向十进制的转换 e mov m al mov eax offset m input3 call dispmsg mov eax offset array call readmsg mov len al 获得字符串长度 xor ecx ecx 异或清零 mov cl len 计数 dec cl 自减 1 xor eax eax mov edx 1 初始权值 again cmp array ecx A jl shiliu shi1 小于 A 转向 shiliu shi1 cmp array ecx F jg shiliu shi1 大于 Z 转向 shiliu shi1 xor ebx ebx mov bl array ecx 相对寻址 sub bl 55 转换成相应的数字 imul ebx edx add eax ebx imul edx 16 改变权值 jmp shiliu shi3 shiliu shi1 cmp array ecx 0 jl shiliu shi2 小于 0 转向 shiliu shi2 cmp array ecx 9 jg shiliu shi2 大于 9 转向 shiliu shi2 xor ebx ebx 临时寄存 mov bl array ecx sub bl 0 转换成相应的数字 imul ebx edx add eax ebx imul edx 16 改变权值 jmp shiliu shi3 shiliu shi2 mov eax offset m err call dispmsg 提示输入错误 jmp e shiliu shi3 dec ecx 自减 cmp ecx 0 jnl again 不小于 0 转向 again mov sum eax cmp m d 判断选择的功能 jz d 为 d 继续进行转换成二进制 cmp m e jz ee 为 e 直接输出 ee mov eax offset m output3 call dispmsg mov eax sum 数据输出 call dispuid call dispcrlf jmp meau 返回主菜单 q jmp done 退出 done exit 0 end start 6 设计过程中遇到的问题及解决办法设计过程中遇到的问题及解决办法 在代码转换程序设计的过程中 字母转换基本上没有什么问题 主要困难之处在于 二进制 十六进制 十进制之间的互换 1 二进制转换成十六进制 刚开始的时候是计划采用每四个二进制位转换成一个 十六进制的方法 然而其二进制的位数又不能简单的确定 因此最后采用先输入二进制的 位数 再输入二进制数的方法 以便于控制在转换过程中需要移动的位数 另外 在转换 成十六进制的过程中 面临着超过 9 就必须转换成相应的字母的问题 最后通过查阅资料 采用了先将其转换成相应的 assic 码 再进行存储相关的十六进制数 最后通过相对寻址 将十六进制数的每一位输出来 2 十六进制转换成十进制 主要是采用按权展开相加的方法 但是每一位的权值 又不一样 这就使得数值难以控制 最

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论