Intel汇编程序设计-整数算术指令(下)
7.5 扩展加法和减法
扩展精度的假发和减法是指任意尺寸大小数字的加法和减法。例如要求你写一个C++程序,把两个1024位的整数相加,解决方案可不是那么简单!但在汇编语言中,ADC(带进位加)指令和SBB(带进位减)指令非常适合于解决此类问题。
7.5.1 ADC指令
ADC(AddWithCarry)指令把源操作数、目的操作数以及进位标志相加。指令格式与MOV指令是一样的:
ADC reg ,reg
ADC mem ,reg
ADC reg ,mem
ADC mem ,imm
ADC reg ,imm
例如,下面的指令把两个8位整数相加(FFh+FFh),16位解雇01FEh被存放在DL:AL中:
mov dl ,0
mov al ,0FFh
add al ,0FFh ;AL = FE
adc dl ,0 ;DL = 01
两个32位整数相加(FFFFFFFFh+FFFFFFFFh)相加,在EDX:EAX中存放64位的和0000001FFFFFFFEh:
mov edx ,0
mov eax ,0FFFFFFFFh
add eax ,0FFFFFFFFh
adc edx ,0
7.5.2 扩展加法的例子
下面的Extended_Add过程把两个任意相同尺寸的整数相加,程序使用一个循环把没对双字相加,保存进位标志,并是仅为标志参与后面的双字的假发运算:
下面摘自ExtAdd.asm的程序片段调用了Extended_Add过程,例子中传递的是两个64位整数。注意特别分配了额外的双字节以保存可能出现的进位值:
果真发生了进位,注意一个问题,就是比如op1 QWORD 0A2B2A40674981234h
eax = OFFSET op1
那么[eax] 是74981234h 而[eax+4]是0A2B2A406。一开始我在最后输出的时候没看懂,后台调试的时候想起来了。
7.5.3 SBB指令
SBB(subtract with borrow)指令从墓地操作数中减去源操作数和进位标志的值。指令允许你的操作与ADC是相同的。
下面的例子是执行64位的减法,把EDX:EAX设置为0000000100000000h并从中减去1,程序首先减去低32位值,进位标志将被设置,然后再减去高32位和进位标志值:
mov edx ,1 ;高半部分
mov eax ,0 ;低半部分
sub eax , 1 ;减去1
sbb edx ,0 ;减去1的高半部分(0)
EDX:EAX 中的64位差值是00000000FFFFFFFFh。
7.6 ACCII和未压缩十进制算术指令
到现在为止,本书讲述的整数算术指令都是处理二进制数值的,尽管CPU是以二进制算术方式进行运算的,但是也能处理ASCII十进制数串的算术运算。后者可以方便地有用户输出并在控制台窗口中显示,无需转换成二进制数值。假设程序需要用户输入两个数字并把他们相加,下面是一个输出样例,其中用书输入了3402和1256:
Enter first numbers: 3402
Enter second number: 1256
The sum is: 4658
在计算和显示数字的时候有两种选择:
1.把两个操作数转换成二进制数值并相加,然后把和从二进制数转换成ASCII码数字串的格式化后显示。
2.连续地把没对ASCII数字直接相加,这样就和是ASCII数字串,可以直接在屏幕上显示。
第二种选择要求在对ASCII数字相加后使用特殊指令来调整其和,指令集中有4条指令可以处理这一类的ASCII加法、减法、乘法和除法:
mov ah ,0
mov al ,’8’ ;AX = 0038h
add al,’2’ ;AX = 006Ah
aaa ;AX = 0100h(结果的ASCII码调整)
or ax ,3030h ;AX = 3130h=’10’(转换成ACSCII码)
AAS AAM AAD也是如此。
7.7.1 DAA指令
DAA指令把ADD和ADC指令执行后AL中的二进制数转换成压缩的十进制数格式。
mov al ,35h
add al ,48h ;AL = 7Dh
daa ;AL = 83h(调整结果)
7.7.2 DAS指令
DAS(decimal adjust after subtraction)指令将SUB或SBB指令执行后AL中的二进制转换成压缩的十进制格式。
mov bl ,48h
mov al ,85h
sub al ,bl ;AL = 3Dh
das ;AL = 37h(调整结果)
7.8 本章小结
Intel汇编程序设计-整数算术指令(下)的更多相关文章
- Intel汇编程序设计-整数算术指令(上)
第七章 整数算术指令 7.1 简介 每种汇编语言都有进行操作数移位的指令,移位和循环移位指令在控制硬件设备.加密数据,以及实现高速的图形操作时特别有用.本章讲述如何进行移位和循环移位操作以及如何使用移 ...
- Intel汇编程序设计-整数算术指令(中)
7.3 移位和循环移位的应用 7.3.1 多双字移位 要对扩展精度整数(长整数)进行移位操作,可把它划分为字节数组.字数组或双字数组,然后再对该数组进行移位操作.在内存中存储数字时通常采用的方式是 ...
- Intel汇编程序设计-高级过程(上)
第八章 高级过程 8.1 简介 本章主要讲: 堆栈框架 变量作用域和生存期 对战参数的类型 通过传递值或者传递引用来传递参数 在堆栈上创建和初始化局部变量 递归 编写多模块程序 内存模型和语言关键字 ...
- Linux下AT&T汇编语法格式与Intel汇编语法格式异同
由于绝大多数的国内程序员以前只接触过Intel格式的汇编语言,很少或几乎没有接触过AT&T汇编语言,虽然这些汇编代码都是Intel风格的.但在Unix和Linux系统中,更多采用的还是AT&a ...
- AT&T 和 Intel 汇编语法的主要区别
转自AT&T 和 Intel 汇编语法的主要区别 作为一个爱折腾的大好青年,补番之余还要补一些 Linux 下的基础,比如 GDB 的正确使用方法.但无论是看 gdb 还是 gcc -S 里的 ...
- ARM学习笔记11——GNU ARM汇编程序设计
GNU ARM汇编程序设计中,每行的语法格式如下: [<label>:] [<instruction | directive | pseudo-instruction>] @c ...
- 《Intel汇编第5版》 Intel CPU小端序
一.MASM汇编器中的数据类型 二.Intel汇编中的立即数类型 三.定义有符号和无符号整数 四.小端序 内存中数据按照字节存储,一个4个字节无符号整数,其高位存储在低地址上,低位存储在高地址上. 比 ...
- 《Intel汇编第5版》 汇编减法程序
第一步: 安装虚拟机32位XP系统 + RadAsm软件 第二步: 下载<Intel汇编语言程序设计第5版>中相关的源代码以及库文件 http://kipirvi ...
- Intel汇编语言程序设计学习-第三章 汇编语言基础-下
3.4 定义数据 3.4.1 内部数据类型 MASM定义了多种内部数据类型,每种数据类型都描述了该模型的变量和表达式的取值集合.数据类型的基本特征是以数据位的数目量的大小:8,16,32,,48, ...
随机推荐
- ts装饰器的用法,基于express创建Controller等装饰器
TS TypeScript 是一种由微软开发的自由和开源的编程语言.它是 JavaScript 的一个超集,而且本质上向这个语言添加了可选的静态类 型和基于类的面向对象编程. TypeScript 扩 ...
- ArrayList源码阅读(小白的java进阶)
ArrayList(线程不安全) ArrayList是一个其容量能够动态增长的动态数组 继承关系 构造方法 是符合collection父接口的规范的 //传0则设置为默认容量 public Array ...
- java网络通信不止UDP,TCP
预备知识 多线程 实现多线程 线程池 IO流 核心功能就是读和写 扩展功能对什么读写,怎么读写,如何优化读写 网络基础 IP IP规定网络上所有的设备都必须有一个独一无二的IP地址,就好比是邮件上都必 ...
- HDU_6693 Valentine's Day 【概率问题】
一.题目 Valentine's Day 二.分析 假设$ s_0 $代表不开心的概率,$ s_1 $代表开心一次的概率. 那么随便取一个物品,那么它的开心概率为$ p _i $,可以推导加入之后使女 ...
- 从设计模式角度看OkHttp源码
前言 说到源码,很多朋友都觉得复杂,难理解. 但是,如果是一个结构清晰且完全解耦的优质源码库呢? OkHttp就是这样一个存在,对于这个原生网络框架,想必大家也看过很多很多相关的源码解析了. 它的源码 ...
- 攻防世界 reverse 进阶 1-4
1.dmd-50 suctf-2016 md5后比较,在线解md5得到: md5(md5($pass)),所以将grape再进行MD5 b781cbb29054db12f88f08c6e161c199 ...
- C++覆盖,隐藏,重载
code[class*="language-"], pre[class*="language-"] { color: rgba(51, 51, 51, 1); ...
- 201871030131-谢林江 实验二 个人项目—《D{0-1} KP》项目报告
项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 1.学习编写PSP2.完成个人项目实验要求3.在Github建仓 这个作业在哪些方面帮助我实现学习目标 1.首次编 ...
- Visual Studio 2015 无法加载.Net FrameWork4.6.2
默认的VS2015是没有.Net Framework4.6.2的 需要我们去到微软官网下载对应的.NET Framework 4.6.2的安装包 安装包分两种,一种是应用级别的还一种是开发级别的,如果 ...
- 【macOS】屏蔽Big Sur更新提示 消除更新红点
下面介绍如何屏蔽macOS系统更新,屏蔽Big Sur更新提示,消除更新红点. 取消自动更新选项 请选取苹果菜单 > "系统偏好设置",然后点按"软件更新&qu ...