32位汇编语言学习笔记(33)--aaa指令
aaa(ASCII adjust after addition)指令,是BCD指令集中的一个指令,用于在两个未打包的BCD值相加后,调整al和ah寄存器的内容。
BCD(Binary-coded decimal)数是指2进制编码的10进制数,占据一个字节的低4位,只有0-9是有效值。
AAA指令做两件事情:
如果al的低4位是在0到9之间,保留低4位,清除高4位,如果al的低4位在10到15之间,则通过加6,来使得低4位在0到9之间,然后再对高4位清零。
如果al的低4位是在0到9之间,ah值不变,CF和AF标志清零,否则,ah=ah+1,并设置CF和AF标志。
下面看一个示例程序:
section .dataEditBuff: db 'abcdefghijklm',10BUFFERLEN equ $-EditBuffFILLCHR equ 35 ;'#'section .textWriteStr:push eax ; Save pertinent registerspush ebxmov eax,4 ; Specify sys_write callmov ebx,1 ; Specify File Descriptor 1: Stdoutint 80H ; Make the kernel callpop ebx ; Restore pertinent registerspop eaxret ; Go homeglobal _start
_start:nopmov ecx,EditBuff mov edx,BUFFERLEN call WriteStrmov edi,EditBuffmov ecx,BUFFERLEN-1mov al,'1' ; Start ruler with digit '1'
DoChar: stosb ; Note that there's no REP prefix!add al,'1' ; Bump the character value in AL up by 1aaa ; Adjust AX to make this a BCD additionadd al,'0' ; Make sure we have binary 3 in AL's high nybbleloop DoChar ; Go back & do another char until ECX goes to 0mov ecx,EditBuff mov edx,BUFFERLEN call WriteStrExit: mov eax,1 ; Code for Exit Syscallmov ebx,0 ; Return a code of zero int 80H ; Make kernel call
程序分析:
mov edi,EditBuff //edi = EditBuff
mov ecx,BUFFERLEN-1 //ecx= BUFFERLEN-1,这样可以不覆盖最后一个换行符
mov al,'1' //al = ‘1’,1的ASCII码值是0x31,低4位恰好是有效的BCD值
DoChar: stosb //edi=al
add al,'1' //两个ASCII码值相加。
aaa //使用aaa指令进行调整,使得低4位是有效的BCD值。只有’9’加’1’会形成无效BCD数(10),调整后al会等于0,其他都不需要调整低4位,只是简单对高4位清零。
add al,'0' //要把数字转换成ASCII码,需要再把’0’加回来,例如9+’0’=’9’。
loop DoChar //ecx=ecx-1,如果ecx不等于0,跳转到DoChar继续循环。ecx=13,所以会填充字符13次。
makefile文件内容:
aaademo: aaademo.old -o aaademo aaademo.o
aaademo.o: aaademo.asmnasm -f elf -g -F stabs aaademo.asm -l aaademo.lst
测试:
[root@bogon aaademo]# make
nasm -f elf -g -F stabs aaademo.asm -l aaademo.lst
ld -o aaademo aaademo.o
[root@bogon aaademo]# ./aaademo
abcdefghijklm
1234567890123
32位汇编语言学习笔记(33)--aaa指令相关推荐
- windows下32位汇编语言学习笔记
windows下32位汇编语言学习笔记 第一章 第一章 背景知识 80x86处理器的存储器 4个数据寄存器 EAX,EBX,ECX,EDX EAX寄存器 所有API函数的返回值都保存在EAX里,注意 ...
- 32位汇编语言学习笔记(45)--测试简单文件操作接口(完)
这是<Assembly Language step by step programming with linux>书中的最后一个程序,也是全书中的最复杂的一个程序. 首先看一下这个程 ...
- 32位汇编语言学习笔记(43)-- 生成随机数
此程序出自<Assembly Language step by step programming with linux>第12章,用于演示随机数函数的使用,共涉及两个随机数函数: v ...
- 32位汇编语言学习笔记(36)--repne scasb指令
repne scasb指令,用于扫描字符串,计算字符串的长度,如下两条指令: cld repne scasb 对应的等价指令是: scans:inc edi dec ecx je ...
- 16位汇编语言学习笔记(2)—— 汇编程序设计
文章目录 4. 顺序程序设计 4.1 十进制的算数运算 4.2 输入输出功能调用 4.3 综合案例 5. 分支程序设计 5.1 转移指令 5.1.1 条件转移指令 单标志条件转移指令 无符号数专用条件 ...
- 16位汇编语言学习笔记(1)——基础知识
文章目录 1.配置汇编学习环境 1.1 工具下载 1.2 配置环境 2. 汇编命令基础 2.1 简单使用 2.2 常用命令 3. 汇编语言基础 3.1 汇编语言程序与汇编程序 3.2 汇编语言程序的格 ...
- 琢石成器――windows环境下32位汇编语言程序设计(第三版)笔记
琢石成器――windows环境下32位汇编语言程序设计(第三版)笔记 2011年12月20日 基础篇 第1章 背景知识 1 1.1 Win32的软硬件平台 1.1.1 80x86系列处理器简史 1.1 ...
- ARM汇编语言学习笔记
汇编是对寄存器操作的,不知道一些和主控制器相关的寄存器的作用,根本无法理解某些指令,所以先自己学习相关寄存器和工作模式. 下面是<ARM 嵌入式体系结构与接口技术(Cortex-A8 版) &g ...
- win32汇编语言学习笔记(三)
汇编语言学习笔记(三) CH3.Windows汇编基础 .386 .model flat,stdcall option casemap:none 定义程序使用的指令集.工作模式 相应的还有:.8086 ...
最新文章
- 手撸 webpack4.x 配置(一)
- LoaderManager使用具体解释(三)---实现Loaders
- Yarn 问题发现与解决
- php和mysql的版本区别_MySQL各个版本区别_MySQL
- 在Ubuntu 16.04环境下安装Docker-CE(附视频教程)
- php 电压 异常,tv断线警告是什么原因
- Linux目录管理类命令之ls
- 氢气露点和湿度换算_如何创建氢气鼓组以获取乐趣和收益
- spring 主从表_听听京东架构师浅谈,MySQL binlog 主从同步
- iOS开发篇——C++函数模板介绍
- 微信小程序开发页面介绍
- 微信视频号如何申请认证,流程是什么?
- 大连理工大学软件学院2022年秋季学期《矩阵与数值分析》上机作业
- 一个遮罩层怎么遮罩两个图层_遮罩动画是由两个图层组成的,一个是遮罩层,一个是被遮罩层。...
- [国家集训队2011]跳跳棋
- 阿里云ECS云服务器CPU处理器型号主频睿频实例规格表
- 惠普服务器装系统无法识别u盘,惠普uefi bios无法识别u盘的解决方法
- correl函数相关系数大小意义_Excel使用Correl函数返回相关系数并确定属性关系的步骤方法...
- 洛谷 P1888	三角函数 C语言
- 生命不可承受之重, 请关爱过劳人员
热门文章
- CuteOne基于Python3的OneDrive多网盘挂载程序+带会员
- 计算机屏幕出现条纹w7,为什么我安装win7后,屏幕的分辨率会下降?屏幕上有一横一横的条纹?...
- H5新特性百度地图SDK--API引入、地图控件、地理编码与逆地理编码、地图标注、路径规划(基于2.0)
- linux网络显示不出来ens33,如何解决Linux 系统下 ifconfig 命令无网络接口 ens33
- 文件管理之文件共享与用户类型
- java comparable null_Java中Comparable和Comparator你知多少?
- lseek函数的用法
- 《道德经》第三十一章
- DStream输出之使用foreachRDD()将数据写入诸如Mysql的外部数据库中
- 编程练习题_2.12