热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

关于汇编指令aaa的问题

指令格式:AAA指令功能:对2个未组合的BCD码相加后的结果(必须在AL中)进行调整,产生一个正确的BCD码。如果AL低4位>09H或者AF1,则进行(AL)+06H→(AL),同时(AH
指令格式:AAA

指令功能:对2个未组合的BCD码相加后的结果(必须在AL中)进行调整,产生一个正确的BCD码。如果AL低4位>09H或者AF=1,则进行(AL)+06H→(AL),同时(AH)+1→(AH),AL的高4位清0,然后使AF=1,CF=1

标志位影响:只影响AF与CF

注意:此指令通常跟在加法指令之后

而大致实践情况和上面一致,需要说明的是AL低4位>09H和AF=1这两个条件只要有一个(或两个都)满足,AH则+1.
同时实践出另一个奇异之处,就是在AAA的+6时AL可能向AH进位.真是很奇异!
提供以下代码供实践:
    mov ax,0fh        ;ax=000fh
    add al,0eh       ;ax=001dh   (af=1,低4位>9)
    aaa                ;ax=0103h   符合低4+6,高4清0,AH+1  
    mov ax,0efh   ;ax=00efh
    add al,0eh     ;ax=00fdh   (af=1,低4位>9)
    aaa                 ; 实际实验结果ax=0203h,理论上:本来AX应和上面一致=0103h(低4+6,高4清0,AH+1),竟然AL+6后还进位1进AH了这是为什么啊??

4 个解决方案

#1


怎么破坏了文章的完整性了呢?

#2


这个AAA指令的奇异之处,记得是我几年前在这个版参与讨论时发现了,后一直不得其解,鉴于当年很喜欢钻牛角,就记录在某处,后因种种原因,没再接触汇编。今天偶上CSDN,看到了这个问题,感觉很熟悉(其实这个就是摘取我那记录的一段。无妨,学术就是要多探讨,只有多公布,才可多探讨),就看了下,禁不住奇心又起,再在网上搜了下,一种比较靠谱的说法是:
mov ax,0efh 
add al,0eh    
 aaa
这段代码中的0efh和0eh已不是非压缩BCD码(确实是这样),所以AAA后产生的结果不正确也就理所当然了。因为AAA指令是进行非压缩BCD码调整的指令,所以两个不符合非压缩BCD码这一条件要求的数值进行加法操作后,其进行调整不出现正确答案是很正常的。

以上为网上一种比较合理的说法,我基本也以为然。毕竟条件不符,结果不符也就很合理了。
记得在这个版以前有个先辈常告诫的一句话就是“不迷信”,不迷信权威,不迷信书本,多实践。所以,我以前也常钻牛角,敢于置疑,这个奇异的AAA也是在这种情况下发现的。但现在,我又有了一个新观念,开始喜爱置疑自己。
所以,在看了那个网友比较靠谱的说法后,我对自己的以为然又置疑了一下。

以下为我个人对AAA指令的一点新看法。供爱好者一起来置疑,探讨,推究。
一般说:
AAA指令功能:对2个未组合的BCD码相加后的结果(必须在AL中)进行调整,产生一个正确的BCD码。如果AL低4位>09H或者AF=1,则进行(AL)+06H→(AL),同时(AH)+1→(AH),AL的高4位清0,然后使AF=1,CF=1。否则,AF=0,CF=0。
标志位影响:只影响AF与CF。

我想,这个定义基本是正确的。
我也用很多数值进行了实验,基本没问题,当然前提是你 遵循2个未组合的BCD码相加,至少相加的数低4位要是非压缩(非组合)BCD码,如果低4位不是,可能结果就真不正确了。
这里要探说的是AAA指令AAA执行之前,如果AL高4位为1111B(0FH),且L低4位大于9的话(如MOV AL,0f6h,ADD AL,8h,AAA),AAA就将要+6(进行BCD调整),这就导致低4位产生向高4位进位。高4位因原值为0FH,在低4位进1以后,他也产生进位,而且这个进位将被加进AH,其余将遵循指令的功能解释进行执行,此时这个进位产生1加进AH后将破坏了这个AAA指令的规则,产生AH多1的不准确值。这也正符合了那位网友所说条件不符,结果也不符。其实,如果在AAA之前, “如果AL高4位为1111B(0FH),且L低4位大于9的话,”这个条件不成立的话,即使不是非压缩BCD码进行的加法后再AAA,我们也将得到非视高4位(高4位在非组合BCD码中是不表示码值的)的正确结果。而问题正是出在这个高4位为1111B的情况下,为什么呢/因为他在低4进位后它也要进位,但假设我们转念一想,它只管进位好了,我不不这个进位加进AH里去不就好了。正是!假设这个进位不加进AH,其结果还是会正确。由此,我们可以进一步思索,在指令进行(AL)+06H→(AL)时,并不是同时(AH)+1→(AH),如果是同时(AH)+1→(AH)的话,那个AL的进位是进不了AH的,由此,我们是不是窥出,其实是(AL)+06H→(AL)后才(AH)+1→(AH)的,其实再进一步思索一下,也不是(AH)+1→(AH)的,应该是AH带进位加1,或者说是类似这样的。
如此,这个AAA指令的就很明确的呈现在我们面前,它的功能可以说是这样的:
它将先侦测AL是否大于9,AF是否=1。如果AL>9,或者AF=1,则AL+6→AL,AH带进位+1→AH,置AL高4为0,使AF=1,CF=1,否则AF=0,CF=0。
这样,理解了它的实质,我们就不必管他只能针对非组合的BCD码的调整了。可以把它拿来为我所欲用了。
为了加强它的直观性,列举几个码段,以供直观。

    ;ax=0008h
    add al,09h 
    ;ax=0011h (AF=1,低4位<9)
    aaa 
    ;ax=0107h 符合AL低4+6,高4清0,AH+1,标准非压缩BCD调整!
;=================================================
    mov ax,08h 
    ;ax=0008h
    add al,03h 
    ;ax=000Bh (AF=0,低4位>9)
    aaa 
    ;ax=0101h 符合AL低4+6,高4清0,AH+1,标准非压缩BCD调整!
;==================================================
    mov ax,02h 
    ;ax=0002h
    add al,03h 
    ;ax=0005h (AF=0,低4位<9)
    aaa 
    ;ax=0005h 不必AL低4+6,高4清0,不必AH+1,标准非压缩BCD调整!
;==================================================
    mov ax,f2h 
    ;ax=00f2h,虽然AL里不是标准非压缩BCD码,在非视高4位的情况下,后面也是正确结果.
    add al,03h 
    ;ax=00f5h (AF=0,低4位<9)
    aaa 
    ;ax=0005h 不必AL低4+6,高4清0,不必AH+1,非视高4位,结果也正确!
;====================================================
    mov ax,058h 
    ;ax=0058h,虽然AL里不是标准非压缩BCD码,在非视高4位的情况下,后面也是正确结果.
    add al,067h 
    ;这里的067H也不是标准非压缩BCD码
    ;ax=00bfh (AF=0,低4位>9)
    aaa 
    ;ax=0105h 遵循AL低4+6,高4清0,遵循AH+1,非视高4位后,结果正确!
;=======================================================
    mov ax,058h 
    ;ax=0058h,虽然AL里不是标准非压缩BCD码,在非视高4位的情况下,后面也是正确结果.
    add al,069h 
    ;这里的069H也不是标准非压缩BCD码
    ;ax=00c1h (AF=1,低4位<9)
    aaa 
    ;ax=0107h 遵循AL低4+6,高4清0,遵循AH+1,非视高4位后,结果正确!
;=========================================================
    mov ax,0e8h 
    ;ax=00e8h,虽然AL里不是标准非压缩BCD码,在非视高4位的情况下,后面也是正确结果.
    add al,009h 
    ;ax=00f1h 虽然AL高4位为1111B (AF=1,低4位<9) 但非视高4结果仍正确
    aaa 
    ;ax=0107h 遵循AL低4+6,高4清0,遵循AH+1,非视高4位后,结果正确!


==========================================================
这个就是那个很奇异的结果了,但现在也不奇异了!
    mov ax,0f5h 
    ;ax=00f5h,AL里不是标准非压缩BCD码
    add al,006h 
    ;ax=00fbh AL高4位为1111B (AF=0,低4位>9) 结果就要奇异了.
    aaa 
    ;ax=0201h 遵循AL低4+6,高4清0,遵循AH+1,但AH=2了,它带进位加了!


==========================================================
这个是典型非标准BCD码的操作了(相加数里低4都不是BCD码),就没法保证结果的正确性了,后果自负!
    mov ax,000fh 
    ;ax=000fh,AL里不是标准非压缩BCD码
    add al,00fh 
    ;Al里也不是标准非压缩BCD码
    ;ax=001eh  (AF=1,低4位>9) 这个结果由自己承担了..
    aaa 
    ;ax=0104h 遵循AL低4+6,高4清0,遵循AH+1,但结果真正不正确了,!



就匆匆写这点了,希望我早些时候发现的一个AAA奇异之处到现在能有个相对比较有说法的结局。
希望给有需要者一个抛引,也希望有再来者能进一步探讨。

#3


更正:
如此,这个AAA指令的就很明确的呈现在我们面前,它的功能可以说是这样的:
它将先侦测AL低4位是否大于9,AF是否=1。如果AL(低4)>9,或者AF=1,则AL+6→AL,AH带进位+1→AH,置AL高4为0,使AF=1,CF=1,否则AF=0,CF=0。

#4


该回复于2015-05-19 16:00:49被管理员删除

推荐阅读
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了新款奇骏的两个让人上瘾的功能,分别是智能互联系统和BOSE音响。通过对新款奇骏的配置和功能进行评测,探讨了这两个新增功能的使用体验和优势。此外,还介绍了新款奇骏的其他配置和改进,如增加的座椅和驾驶辅助系统,以及内饰的舒适性提升。对于喜欢音响的消费者来说,BOSE音响的升级也是一个亮点。最后,文章提到了BOSE音响的数字还原能力,以及7座版无法配备BOSE音响的原因。 ... [详细]
  • 本文总结了在开发中使用gulp时的一些技巧,包括如何使用gulp.dest自动创建目录、如何使用gulp.src复制具名路径的文件以及保留文件夹路径的方法等。同时介绍了使用base选项和通配符来保留文件夹路径的技巧,并提到了解决带文件夹的复制问题的方法,即使用gulp-flatten插件。 ... [详细]
  • 前端性能优化无损压缩webp格式的图片
    一、什么是webpWebP格式,谷歌开发的一种旨在加快图片加载速度的图片格式。图片压缩体积大约只有JPEG的23,并能节省大量的服务器宽带资源和数据空 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 突破MIUI14限制,自定义胶囊图标、大图标样式,支持任意APP
    本文介绍了如何突破MIUI14的限制,实现自定义胶囊图标和大图标样式,并支持任意APP。需要一定的动手能力和主题设计师账号权限或者会主题pojie。详细步骤包括应用包名获取、素材制作和封包获取等。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了Redis中RDB文件和AOF文件的保存和还原机制。RDB文件用于保存和还原Redis服务器所有数据库中的键值对数据,SAVE命令和BGSAVE命令分别用于阻塞服务器和由子进程执行保存操作。同时执行SAVE命令和BGSAVE命令,以及同时执行两个BGSAVE命令都会产生竞争条件。服务器会保存所有用save选项设置的保存条件,当满足任意一个保存条件时,服务器会自动执行BGSAVE命令。此外,还介绍了RDB文件和AOF文件在操作方面的冲突以及同时执行大量磁盘写入操作的不良影响。 ... [详细]
  • 本文介绍了在Python中使用zlib模块进行字符串的压缩与解压缩的方法,并探讨了其在内存优化方面的应用。通过压缩存储URL等长字符串,可以大大降低内存消耗,虽然处理时间会增加,但是整体效果显著。同时,给出了参考链接,供进一步学习和应用。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
  • 本文介绍了Android中的assets目录和raw目录的共同点和区别,包括获取资源的方法、目录结构的限制以及列出资源的能力。同时,还解释了raw目录中资源文件生成的ID,并说明了这些目录的使用方法。 ... [详细]
author-avatar
每天吃的饱饱的
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有