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指令相关推荐

  1. windows下32位汇编语言学习笔记

    windows下32位汇编语言学习笔记 第一章  第一章 背景知识 80x86处理器的存储器 4个数据寄存器 EAX,EBX,ECX,EDX EAX寄存器 所有API函数的返回值都保存在EAX里,注意 ...

  2. 32位汇编语言学习笔记(45)--测试简单文件操作接口(完)

     这是<Assembly Language step by step programming with linux>书中的最后一个程序,也是全书中的最复杂的一个程序. 首先看一下这个程 ...

  3. 32位汇编语言学习笔记(43)-- 生成随机数

     此程序出自<Assembly Language step by step programming with linux>第12章,用于演示随机数函数的使用,共涉及两个随机数函数: v ...

  4. 32位汇编语言学习笔记(36)--repne scasb指令

     repne scasb指令,用于扫描字符串,计算字符串的长度,如下两条指令: cld repne scasb 对应的等价指令是: scans:inc edi     dec ecx     je ...

  5. 16位汇编语言学习笔记(2)—— 汇编程序设计

    文章目录 4. 顺序程序设计 4.1 十进制的算数运算 4.2 输入输出功能调用 4.3 综合案例 5. 分支程序设计 5.1 转移指令 5.1.1 条件转移指令 单标志条件转移指令 无符号数专用条件 ...

  6. 16位汇编语言学习笔记(1)——基础知识

    文章目录 1.配置汇编学习环境 1.1 工具下载 1.2 配置环境 2. 汇编命令基础 2.1 简单使用 2.2 常用命令 3. 汇编语言基础 3.1 汇编语言程序与汇编程序 3.2 汇编语言程序的格 ...

  7. 琢石成器――windows环境下32位汇编语言程序设计(第三版)笔记

    琢石成器――windows环境下32位汇编语言程序设计(第三版)笔记 2011年12月20日 基础篇 第1章 背景知识 1 1.1 Win32的软硬件平台 1.1.1 80x86系列处理器简史 1.1 ...

  8. ARM汇编语言学习笔记

    汇编是对寄存器操作的,不知道一些和主控制器相关的寄存器的作用,根本无法理解某些指令,所以先自己学习相关寄存器和工作模式. 下面是<ARM 嵌入式体系结构与接口技术(Cortex-A8 版) &g ...

  9. win32汇编语言学习笔记(三)

    汇编语言学习笔记(三) CH3.Windows汇编基础 .386 .model flat,stdcall option casemap:none 定义程序使用的指令集.工作模式 相应的还有:.8086 ...

最新文章

  1. 手撸 webpack4.x 配置(一)
  2. LoaderManager使用具体解释(三)---实现Loaders
  3. Yarn 问题发现与解决
  4. php和mysql的版本区别_MySQL各个版本区别_MySQL
  5. 在Ubuntu 16.04环境下安装Docker-CE(附视频教程)
  6. php 电压 异常,tv断线警告是什么原因
  7. Linux目录管理类命令之ls
  8. 氢气露点和湿度换算_如何创建氢气鼓组以获取乐趣和收益
  9. spring 主从表_听听京东架构师浅谈,MySQL binlog 主从同步
  10. iOS开发篇——C++函数模板介绍
  11. 微信小程序开发页面介绍
  12. 微信视频号如何申请认证,流程是什么?
  13. 大连理工大学软件学院2022年秋季学期《矩阵与数值分析》上机作业
  14. 一个遮罩层怎么遮罩两个图层_遮罩动画是由两个图层组成的,一个是遮罩层,一个是被遮罩层。...
  15. [国家集训队2011]跳跳棋
  16. 阿里云ECS云服务器CPU处理器型号主频睿频实例规格表
  17. 惠普服务器装系统无法识别u盘,惠普uefi bios无法识别u盘的解决方法
  18. correl函数相关系数大小意义_Excel使用Correl函数返回相关系数并确定属性关系的步骤方法...
  19. 洛谷 P1888 三角函数 C语言
  20. 生命不可承受之重, 请关爱过劳人员

热门文章

  1. CuteOne基于Python3的OneDrive多网盘挂载程序+带会员
  2. 计算机屏幕出现条纹w7,为什么我安装win7后,屏幕的分辨率会下降?屏幕上有一横一横的条纹?...
  3. H5新特性百度地图SDK--API引入、地图控件、地理编码与逆地理编码、地图标注、路径规划(基于2.0)
  4. linux网络显示不出来ens33,如何解决Linux 系统下 ifconfig 命令无网络接口 ens33
  5. 文件管理之文件共享与用户类型
  6. java comparable null_Java中Comparable和Comparator你知多少?
  7. lseek函数的用法
  8. 《道德经》第三十一章
  9. DStream输出之使用foreachRDD()将数据写入诸如Mysql的外部数据库中
  10. 编程练习题_2.12