汇编学习笔记-输出月份缩写
编译环境: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
一些语句的解释:
label
name label type
为数据段中定义的下一个变量提供不同的名称和大小属性,共享同一个内存位置,label伪指令自身不分配内存。在本代码中可以视为用monin来作为输入缓冲区内存地址的名字,在mov dx,monin并调用输入功能时,系统会根据内存地址开始第一个字来设置最大可输入的字符数(包括回车,回车必须要占用1个字符数),月份的数字最多是2位+1位回车符,因此max设置为3。第二个字用于存储实际输入字符的个数,在输入字符后,系统会自动将第二个字赋值为实际输入字符的个数(此处回车不会算入其中,如果直接回车,那么act是0,在后续cmp act 0会调用退出代码)。第三~n个字作为输入的缓冲区,系统会将输入的字符存储到第三个字开始的地址中(回车也会被存储进去),本代码中缓冲区从第3个字开始到第6个字(包含)结束,因此最多2个数字+回车。
具体看代码中的注释cmp
cmp的功能相当于减法指令,cmp不保存结果,只影响符号位。sub指令执行过后ax被赋为减法的结果。如果减法的结果为0,则会将ZF置为1je
je code如果ZF=1,则跳转到语句coderep
先将循环次数存入cx,重复(cx)次语句。注意:每循环一次cx会自动减1cld
将标志寄存器Flag的方向标志位DF清零。在字串操作中使变址寄存器SI或DI的地址指针自动增加,字串处理由前往后。movsb
movsb字符传送指令,将DS:SI的字节复制到ES:DI指向的地址。在本代码中是将月份缩写数组中 3个缩写字母复制到变量alfmon(待输出区)中
汇编学习笔记-输出月份缩写相关推荐
- 汇编学习笔记——汇编指令
目录 汇编指令 nop指令 mov.add.sub指令 adc.sbb指令 and.or指令 移位指令 逻辑左/右移指令 循环左/右移指令 算术左/右移指令 带进位循环左/右移指令 inc指令 pus ...
- 汇编学习笔记:对抗反汇编实验2019092801
汇编学习笔记:对抗反汇编实验2019092801 实验描述 实验环境 实验过程 实验结论 实验描述 使用相连的jz和jnz指令跳转到紧接着jnz指令的call指令的第二个字节.call指令实际上无效. ...
- 汇编学习笔记——伪指令
目录 伪指令 段定义 结束标记 段关联标记 数据定义 标号 offset指令 seg指令 地址标号 数据标号 代码分段 程序标识 多文件系统 字符输入 重复定义 注释 重复汇编伪指令 伪指令汇总 伪指 ...
- GNU C内嵌汇编学习笔记
前文所述,只是针对汇编格式的整理,本文将使用coreboot项目代码对其进行实例化.以方便.清晰了解到如何在C语言里使用内嵌汇编的方法.同样地,网络上也有众多文章涉及到这方面,所以本文更多是归纳总结. ...
- 寄存器---汇编学习笔记
第二章 寄存器 2.0 寄存器的绪论 一个典型的CPU由运算器.控制器.寄存器(CPU工作原理)等器件构成.内部总线实现 CPU 内部各个器件之间的联系,外部总线实现CPU和主板其他器件的联系. 在C ...
- 第一个程序---汇编学习笔记
第四章 第一个程序 4.1 一个源程序从写出到执行的过程 一个汇编语言程序从写到最终执行的简要过程. 编写汇编源程序 对源程序进行编译连接 执行可执行文件中的程序 如图所示: 4.2 源程序 程序代码 ...
- 使用BIOS进行键盘输入和磁盘读写---汇编学习笔记
汇编笔记 使用BIOS进行键盘输入和磁盘读写 17.1 int 9中断例程对键盘输入的处理 17.2 使用int 16h中断例程读取键盘缓冲区 17.3 字符串的输入 17.4 应用int 13h中断 ...
- linux中reap用法,ATT汇编学习笔记(一)
file命令使用介绍 file最常用的场景就是用来查看可执行文件的运行环境,是arm呢,还是x86呢,还是mips呢?一看便知$ file a.out a.out: ELF 64-bit LSB ex ...
- 寄存器(内存访问)---汇编学习笔记
寄存器(内存访问) 序言 第二章,我们主要从CPU如何执行指令的角度讲解了8086CPU的逻辑结构.形成物理地址的方法.相关的寄存器以及一些指令. 这一章,我们从访问内存的角度继续学习几个寄存器. 3 ...
最新文章
- bootstrap-图标使用
- 文字超长自动加省略号的css写法
- python如何注释掉一段代码_爬取出来的网页代码都被注释掉怎么解决?
- mvc:annotation-driven/浅析
- OnePlus是什么
- qcustomplot时间坐标轴画直线_为什么鸡看到画直线会晕?
- ACM程序设计基础题解
- 雅思准考证可以下载到电脑上吗
- 华为认证hcia含金量_华为hcna认证含金量高吗?
- CATIA二次开发—漫谈开发环境
- py3Fdfs 修复几个bug
- 【JAVA SE】三万字终极魔典 面向对象编程深度讲解(包+继承+多态+抽象类+接口 全面剖析)
- Unity-IOS遇到的坑 --记账本
- vscode常用插件 - Path Autocomplete
- 失去池子的笑果文化越来越不好笑了
- 颜色的前世今生19·外传之PPI、LPI、DPI疑难问题解答
- C语言公制长度转英制长度,英制换算(英制长度转换公制长度换算)
- python二维数组去重复_python 去除二维数组/二维列表中的重复行方法
- Mac 下面安装 Git 步骤
- 巴菲特弃用 20 美元的三星翻盖,换上了 iPhone