- 浏览: 108725 次
- 性别:
- 来自: Mars
文章分类
最新评论
-
a376730551:
红色部分表示 把进位值传递给bh
汇编语言AAA指令多字节加法代码分析(5) -
madbluesky:
死了,只剩下赞扬了...看来不只是中国,全世界都是同一套啊.. ...
麦克杰克逊--------世界上最傻的明星 -
sunloveny:
敬你!
麦克杰克逊--------世界上最傻的明星 -
jiorry:
感动
MJ 一路走好
麦克杰克逊--------世界上最傻的明星 -
javaboy2006:
MJ单纯到不懂得保护自己。永远怀念。
麦克杰克逊--------世界上最傻的明星
来自于《Intel汇编语言程序设计》(第五版)第七章的代码,使用AAA( ASCII adjust after addition )指令来调整ASCII相加之后的结果。源代码如下:
TITLE ASCII Addition (ASCII_add.asm)
; Perform ASCII arithmetic on strings having
; an implied fixed decimal point
INCLUDE Irvine32.inc
DECIMAL_OFFSET = 5 ; offset from right of string
.data
decimal_one BYTE "100123456789765" ; 1001234567.89765
decimal_two BYTE "900402076502015" ; 9004020765.02015
sum BYTE (SIZEOF decimal_one + 1) DUP(0),0
.code
main PROC
; start at the last digit position.
mov esi, SIZEOF decimal_one - 1
mov edi,SIZEOF decimal_one
mov ecx,SIZEOF decimal_one
mov bh,0 ; set carry value to zero
L1:
mov ah,0 ; clear AH before addition
mov al,decimal_one[esi] ; get the first digit
add al,bh ; add the previous carry
aaa ; adjust the sum ( AH = carry )
mov bh,ah ; save the carry in carry1
or bh,30h ; convert it to ASCII
add al,decimal_two[esi] ; add the second digit
aaa ; adjust the sum ( AH = carry )
or bh,ah ; OR the carry with carry1
or bh,30h ; convert it to ASCII
or al,30h ; convert AL back to ASCII
mov sum[edi],al ; save it in the sum
dec esi ; back up one digit
dec edi
loop L1
mov sum[edi],bh; ; save last carry digit
; Display the sum as a string.
mov edx,OFFSET sum
call WriteString
call crlf
exit
main ENDP
END main
下面开始逐句分析。
decimal_one BYTE "100123456789765" ; 1001234567.89765
decimal_one BYTE "900402076502015" ; 9004020765.02015
sum BYTE (SIZEOF decimal_one + 1) DUP(0),0
首先定义了两个数字字符串,用来隐含进行小数点的加法。随后定义了一个放置和的sum变量,这个变量多了一位来放置进位。
然后再来看代码段:
mov esi, SIZEOF decimal_one - 1
mov edi,SIZEOF decimal_one
mov ecx,SIZEOF decimal_one
mov bh,0 ; set carry value to zero
首先,为循环游标 esi 赋值为字符串的最后一个位置,即SIZEOF decimal_one - 1,此时即指向decimal_one的最后一位数字"5" 。 然后是sum的游标edi,为其赋值为SIZEOF decimal_one(因为我们这里比decimal_one的长度多了一位,用来存储进位),还有循环数ecx,赋值为decimal_one的长度。
最后把进位值bh设置为零。
然后让我们看一下接下来的代码:
L1:
mov ah,0 ; 在进行AAA指令之前,一定要清空ah,否则会影响AAA指令结果
mov al,decimal_one[esi] ; 得到decimal_one的esi位置的数字
add al,bh ; 将之前的进位值与al相加(例如,第一次相加时没有进位)
aaa ; 使用aaa调整相加结果,会将进位值保存到ah中
mov bh,ah ; 将进位值保存到bh中
or bh,30h ; 将此时的结果转化成ASCII码
add al,decimal_two[esi] ; 再与decimal_two的第esi位数字相加,保存到al中
aaa ; 调整加法结果,进位将会保存到AH中
or bh,ah ; 将现在的进位进行或操作(不太明白为什么)
or bh,30h ; 将进位值转化为ASCII码
or al,30h ; 将AL中的值转化为ASCII码
mov sum[edi],al ; 将计算完的此位值赋值到sum相应位
dec esi ; 向前移一位,取得下一个相加数的游标位置
dec edi ; 向前移一位,取得下一个相加数的游标位置
loop L1 ; 执行下次循环
mov sum[edi],bh; ; 计算完成之后,将最后一次的进位加到sum的第edi位置
; Display the sum as a string.
mov edx,OFFSET sum ; 将sum的偏移地址赋值到edx中
call WriteString ; 在屏幕上显示此时edx的值,也就是sum的结果
call crlf ; 光标移动到下一行开头
exit ; 退出(Irvine32中的函数)
到这里,程序分析便结束了,程序的结果将为:
1000525533291780
结果共为16位(原两个相加数为15位),并且隐含了小数点。
补充:
因为 ASCII 码的十进制数中的最高位总是0011b,所以才会进行 or bh,30h 的操作;其中未将ASCII码的十进制数的高四位设置为0011b的为未压缩格式,设置之后的才为ASCII格式,示例如下:
ASCII格式: 33 34 30 32
未压缩格式: 03 04 00 02
发表评论
-
IA-32处理器内存管理学习总结?
2009-10-23 14:58 1328内容来自于《Intel汇 ... -
汇编语言秒表程序代码分析(21)
2009-10-23 10:40 2256本文代码来自于《Intel汇编语言程序设计》 (第四版) ... -
汇编语言GetDateTime代码分析(20)
2009-10-23 10:14 1798本文代码来自于 ... -
汇编语言计时器代码分析(19)
2009-10-23 09:45 2178来自于《Intel汇编语言程序设计》(第四版)第1 ... -
汇编语言写文件读文件代码分析(18)
2009-10-22 16:37 2575内容来自于《Intel汇编语言程序设计》(第 ... -
汇编语言32位控制台读取用户输入字符程序代码分析(17)
2009-10-22 15:00 4095来自于《Intel汇编语言程序设计》(第四版)第1 ... -
汇编语言循环遍历链表代码分析(16)
2009-10-22 11:28 1791来自于《Intel汇编语言程序设计》(第四版)第10章- ... -
汇编语言醉汉走路代码分析(15)
2009-10-22 10:50 1308来自于《Intel汇编语言 ... -
汇编语言显示系统时间代码分析(14)
2009-10-21 15:18 2129代码来自于《Intel汇编语言程序设计》(第四版)第10 ... -
汇编语言二分查找排序代码分析(13)
2009-10-21 09:52 1889来自于《Intel汇编语 ... -
汇编语言冒泡排序算法代码分析(12)
2009-10-20 16:52 4174来自于《Intel汇编 ... -
汇编语言裁剪字符串代码分析(11)?
2009-10-20 15:27 1319来自于《Intel汇编语言程序设计》(第四版 ... -
汇编语言求字符串长度代码分析(10)
2009-10-20 11:05 2178来自于《Intel汇编语言程序设计》(第四版)第八 ... -
汇编语言数组乘法代码分析(9)
2009-10-20 10:07 1563来自于《Intel汇编语言程序设计》(第四版)第八章,主 ... -
汇编语言实现递归阶乘算法代码分析(8)
2009-10-20 08:49 3698来自于《Intel汇编语言程序设计》(第四版)第八 ... -
《Intel汇编语言程序设计》第四版勘误
2009-10-19 16:14 996215页: mov BYTE PTR [e ... -
汇编语言16位随机整数填充数组代码分析(7)
2009-10-19 14:55 1402来自于《Intel汇编语言》(第四版)第八章的一段 ... -
汇编语言值传递和引用传递代码分析(6)
2009-10-19 09:40 1186来自于《Intel汇编语言程序设计》(第四版)的第 ... -
汇编语言表格驱动分支选择代码分析(4)
2009-10-16 14:48 1451来自于《Intel汇编语言程序设计》(第四版)第六章。 ... -
汇编语言数组中查找正数代码分析(3)
2009-10-15 16:54 1304《Intel汇编语言程序 ...
相关推荐
汇编语言指令汇总,含: 80868088汇编语言指令集.doc, IBM-PC汇编语言指令集.doc, MCS-51指令详解.doc, 常见汇编语言指令及解释.doc, 汇编语言命令大全.doc, 汇编语言指令集.doc
51汇编多字节加减乘除子程序,及进制转换等子程序
单片机汇编语言--双字节二进制无符号数与单字节和双字节做除法,两个程序
汇编语言指令集收集了几乎所有的汇编语言的指令,并对其进行了分类,方便查询
汇编语言指令大全 汇编语言指令大全 汇编语言指令大全 汇编语言指令大全 汇编语言指令大全 汇编语言指令大全
汇编指令的字节大全,不解释。汇编语言的资料。
汇编语言指令大全 汇编语言 指令周期 字节
汇编语言对应的机器码,非常好的资料文档
这是汇编所涉及到的指令,包括数据传输指令、算术运算指令、逻辑运算指令、转移指令等。
非压缩BCD码调整指令AAA、AAS、AAM、AAD 压缩BCD码调整指令DAA、DAS 位 运算 指令 逻辑运算指令 AND、OR、XOR指令 NOT、TEST指令 移位指令 基本移位指令SHL、SAL、SHR、SAR 循环移位指令ROL...
汇编语言指令中断大全.zip汇编语言指令中断大全.zip汇编语言指令中断大全.zip汇编语言指令中断大全.zip汇编语言指令中断大全.zip汇编语言指令中断大全.zip 汇编语言指令中断大全.zip 汇编语言指令中断大全.zip
汇编语言指令大全 汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或...
汇编语言指令集汇编语言指令集汇编语言指令集
EMC 汇编语言指令集EMC 汇编语言指令集EMC 汇编语言指令集EMC 汇编语言指令集
用汇编实现十进制加法运算,从键盘输入两个一位十进制数相加并输出结果。
方便汇编语言指令的查询,方便、快捷,免去翻书的烦恼。
汇编语言指令集 汇编语言指令集 汇编语言指令汇编语言指令集 集
汇编指令与二进制代码对照表汇编指令与二进制代码对照表
汇编语言各种指令的解释与用法 数据传输指令: 1.传输指令 mov ,进栈指令 push 交换指令 XCHG 输入指令 in 输出指令 out 换码指令 xlat 有效地址传输指lEA 等等汇编指令介绍
汇编语言(assembly language)是一种用于电子...在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。