编译环境:emu8086
附:ASCII码表
https://baike.baidu.com/item/ASCII/309296?fr=aladdin

datas   segment para    'data'
three   db      3     ;JUN等是3个字母的,因此在数组定位中,每3个字节是一个月
mess    db      'Input month number',13,10,'$'
monin   label   byte  ;为数据段中定义的下一个变量提供不同的名称和大小属性,共享同一个内存位置,label伪指令自身不分配内存max db  1         ;最多输入的字符数act db  0         ;在读入缓冲区时,此位置会自动存储输入数字的位数mon db  3 dup(0)  ;存储输入的数字,最多2个数字+1回车;alfmon  db  '>>>',13,10,'$'   ;作为缓冲区使用,这里的>>>可以替换成别的字符,如?代表随机填入。montab  db  'JAN','FEB','MAR','APR','MAY','JUN'db  'JUL','AUG','SEP','OCT','NOV','DEC'
datas   endscodes   segment para    'code'assume cs:codes,ds:datas,es:datas;关联段与段寄存器,编译软件对assume不生成机器码
start:
main    proc    farpush    dsmov     ax,0push    axmov     ax,datasmov     ds,axmov     es,ax;Input monthlea     dx,mess         ;输出提示信息mov     ah,09int     21h             ;执行这条指令时,al的值会改变成24,原因是中断时al会返回刚刚输出的字符,输出的字符$的ASCII码就是24Hlea     dx,monin   mov     ah,0Ah          ;键盘输入到缓冲区,(DS:DX+2)=输入字符串起始地址int     21hmov     DL,13           ;回车->回到当前行的行首mov     ah,02           ;显示输出,DL=输出字符int     21hmov     DL,10           ;换行->移动到下一行的相同位置mov     ah,02           ;显示输出,DL=输出字符int     21h;cmp的功能相当于减法指令,cmp不保存结果,只影响符号位。sub指令执行过后ax被赋为减法的结果cmp     act,0           ;用act减去0,判断输入的数字位数是否为0(直接回车,就退出)je      exit            ;若ZF=1->减法运算结果全为0 则跳转;Convert ASCII to binarymov     ah,30h          ;set up monthcmp     act,2           ;用act减去2,判断输入的数字位数是否为2je      two             ;若ZF=1->减法运算结果全为0 则跳转mov     al,monjmp     conv
two:mov     al,mon+1mov     ah,mon
conv:xor     ax,3030h        ;由于0的ascii码为30,所以要减去30才能获得对应的数字cmp     ah,0            ;Month 01-09?    是否输入了01,02,03这样的形式jz      loc             ;输入了02等形式,直接跳转到loc代码段sub     ah,ah           ;ah寄存器置0add     al,10           ;al寄存器中的值+10;Locate month in table
loc:          lea     si,montab       ;取得月份缩写数组的地址dec     al              ;数组从0开始mul     three           ;每个月份缩写占3个字节,移动到下一个月份需要移动3个字节add     si,ax           ;定位到对应月份缩写的地址mov     cx,03           ;设置循环次数为3cld                     ;将标志寄存器Flag的方向标志位DF清零。在字串操作中使变址寄存器SI或DI的地址指针自动增加,字串处理由前往后lea     di,alfmon       ;取得待输出变量的地址到di中rep     movsb           ;重复movsb指令3次      movsb字符传送指令,将DS:SI的字节复制到ES:DI指向的地址。此处是将月份缩写数组中 3个缩写字母复制到待输出区中;Display alpha monthlea     dx,alfmon       ;将待输出区的地址存到dx中,即将调用09功能输出月份缩写mov     ah,09int     21hjmp     start           ;重复
exit:   mov     ah,4chint     21h
main    endp
codes   ends
end     main

一些语句的解释:

  1. label
    name label type
    为数据段中定义的下一个变量提供不同的名称和大小属性,共享同一个内存位置,label伪指令自身不分配内存。在本代码中可以视为用monin来作为输入缓冲区内存地址的名字,在mov dx,monin并调用输入功能时,系统会根据内存地址开始第一个字来设置最大可输入的字符数(包括回车,回车必须要占用1个字符数),月份的数字最多是2位+1位回车符,因此max设置为3。第二个字用于存储实际输入字符的个数,在输入字符后,系统会自动将第二个字赋值为实际输入字符的个数(此处回车不会算入其中,如果直接回车,那么act是0,在后续cmp act 0会调用退出代码)。第三~n个字作为输入的缓冲区,系统会将输入的字符存储到第三个字开始的地址中(回车也会被存储进去),本代码中缓冲区从第3个字开始到第6个字(包含)结束,因此最多2个数字+回车。
    具体看代码中的注释

  2. cmp
    cmp的功能相当于减法指令,cmp不保存结果,只影响符号位。sub指令执行过后ax被赋为减法的结果。如果减法的结果为0,则会将ZF置为1

  3. je
    je code如果ZF=1,则跳转到语句code

  4. rep
    先将循环次数存入cx,重复(cx)次语句。注意:每循环一次cx会自动减1

  5. cld
    将标志寄存器Flag的方向标志位DF清零。在字串操作中使变址寄存器SI或DI的地址指针自动增加,字串处理由前往后。

  6. movsb
    movsb字符传送指令,将DS:SI的字节复制到ES:DI指向的地址。在本代码中是将月份缩写数组中 3个缩写字母复制到变量alfmon(待输出区)中

汇编学习笔记-输出月份缩写相关推荐

  1. 汇编学习笔记——汇编指令

    目录 汇编指令 nop指令 mov.add.sub指令 adc.sbb指令 and.or指令 移位指令 逻辑左/右移指令 循环左/右移指令 算术左/右移指令 带进位循环左/右移指令 inc指令 pus ...

  2. 汇编学习笔记:对抗反汇编实验2019092801

    汇编学习笔记:对抗反汇编实验2019092801 实验描述 实验环境 实验过程 实验结论 实验描述 使用相连的jz和jnz指令跳转到紧接着jnz指令的call指令的第二个字节.call指令实际上无效. ...

  3. 汇编学习笔记——伪指令

    目录 伪指令 段定义 结束标记 段关联标记 数据定义 标号 offset指令 seg指令 地址标号 数据标号 代码分段 程序标识 多文件系统 字符输入 重复定义 注释 重复汇编伪指令 伪指令汇总 伪指 ...

  4. GNU C内嵌汇编学习笔记

    前文所述,只是针对汇编格式的整理,本文将使用coreboot项目代码对其进行实例化.以方便.清晰了解到如何在C语言里使用内嵌汇编的方法.同样地,网络上也有众多文章涉及到这方面,所以本文更多是归纳总结. ...

  5. 寄存器---汇编学习笔记

    第二章 寄存器 2.0 寄存器的绪论 一个典型的CPU由运算器.控制器.寄存器(CPU工作原理)等器件构成.内部总线实现 CPU 内部各个器件之间的联系,外部总线实现CPU和主板其他器件的联系. 在C ...

  6. 第一个程序---汇编学习笔记

    第四章 第一个程序 4.1 一个源程序从写出到执行的过程 一个汇编语言程序从写到最终执行的简要过程. 编写汇编源程序 对源程序进行编译连接 执行可执行文件中的程序 如图所示: 4.2 源程序 程序代码 ...

  7. 使用BIOS进行键盘输入和磁盘读写---汇编学习笔记

    汇编笔记 使用BIOS进行键盘输入和磁盘读写 17.1 int 9中断例程对键盘输入的处理 17.2 使用int 16h中断例程读取键盘缓冲区 17.3 字符串的输入 17.4 应用int 13h中断 ...

  8. linux中reap用法,ATT汇编学习笔记(一)

    file命令使用介绍 file最常用的场景就是用来查看可执行文件的运行环境,是arm呢,还是x86呢,还是mips呢?一看便知$ file a.out a.out: ELF 64-bit LSB ex ...

  9. 寄存器(内存访问)---汇编学习笔记

    寄存器(内存访问) 序言 第二章,我们主要从CPU如何执行指令的角度讲解了8086CPU的逻辑结构.形成物理地址的方法.相关的寄存器以及一些指令. 这一章,我们从访问内存的角度继续学习几个寄存器. 3 ...

最新文章

  1. bootstrap-图标使用
  2. 文字超长自动加省略号的css写法
  3. python如何注释掉一段代码_爬取出来的网页代码都被注释掉怎么解决?
  4. mvc:annotation-driven/浅析
  5. OnePlus是什么
  6. qcustomplot时间坐标轴画直线_为什么鸡看到画直线会晕?
  7. ACM程序设计基础题解
  8. 雅思准考证可以下载到电脑上吗
  9. 华为认证hcia含金量_华为hcna认证含金量高吗?
  10. CATIA二次开发—漫谈开发环境
  11. py3Fdfs 修复几个bug
  12. 【JAVA SE】三万字终极魔典 面向对象编程深度讲解(包+继承+多态+抽象类+接口 全面剖析)
  13. Unity-IOS遇到的坑 --记账本
  14. vscode常用插件 - Path Autocomplete
  15. 失去池子的笑果文化越来越不好笑了
  16. 颜色的前世今生19·外传之PPI、LPI、DPI疑难问题解答
  17. C语言公制长度转英制长度,英制换算(英制长度转换公制长度换算)
  18. python二维数组去重复_python 去除二维数组/二维列表中的重复行方法
  19. Mac 下面安装 Git 步骤
  20. 巴菲特弃用 20 美元的三星翻盖,换上了 iPhone

热门文章

  1. nuc element i5-8265U黑苹果配置
  2. Eclipse运行jsp文件,发现页面无法访问!
  3. 苹果手机计算机怎么放桌面,苹果手机iPhone装了App在桌面找不到图标的解决办法...
  4. 人员考勤,MySQL数据库一个表自动生成3表筛选人员迟到早退缺勤
  5. Java接口的基本概念详解
  6. 如何用几何画板把圆奇数等分
  7. go-kit入门指南
  8. 游戏本地文件乱码问题
  9. 家用计算机硬盘一般价格,家用电脑使用企业级硬盘的效果会很好吗?
  10. EasyExcel锁定指定单元格 禁止表格复制