移位除法运算(汇编)

合集下载

汇编语言中求解任意十进制整数除法的一个算法

汇编语言中求解任意十进制整数除法的一个算法
单 元应 既可 以接收 操作数 符号 的 AS I 码 , C I 也可 以接 收操 作数绝 对值 的 AS I 码. 了算法 描 述方 便 , CI 为 只讨 论 B +2单元 接收 操作数 符号 的 AS I 码 的情形 . UF CI
()数 据检 验. 照图 1所示 的格 式设 置被 除数 和 除 数 的缓 冲 区 , 2 按 分别 为 dvdn iie d和 dvsr程 序要 求 ii . o
B +2单 元存 储操 作 数 符 号 的 AS I , B UF CI码 从 UF+3单元 起 存 储 操 作 数 绝 对 值 的 AS I . 1中 的 CI码 图
B UF显示 了 0 AH 功能 所要 求 的数 据缓 冲区的 格式 .
需要 说 明的是 , 实际 的数据键 人 中 , 户键 入 正 数 时常 常省 略 “ 号 , 在 用 +” 因此 操 作 数缓 冲 区的 B +2 UF
中 圈 分 类 号 : 1 TP3 3 文献标识码 :ቤተ መጻሕፍቲ ባይዱ A 文 章 编 号 :10 — 7 5 2 0 ) 4 0 2 — 5 0 1 8 3 (0 6 0 — 4 8 0
任 意两 个十进 制整 数除 法 的汇编 语 言实现 问题’ , 在应 用 软件 的底层 开 发 中有 广 泛 的应 用 . 对于 两个 整数
的除法 运算 ,0 8 编语 言指令 系统 提供 了 D V 和 I I 8 x6汇 I D V两 条指令 , 分别 进行 无符 号 和 有符 号二 进 制数 除
法 运算 , 以解 决无 符 号数 和有符 号数 的 字节 除 法 、 除 法 及双 字 除 法 问题 . 是 , 被 除 数 绝对 值 大 于 6 可 字 但 若 4 位( 二进 制 ) 或除数 绝对 值大 于 3 2位 ( 二进 制) , 时 不能 直 接使 用 D V 或 I V 给 出商 值及 余 数 , 就使 得 在 I DI 这 实际应用 中直接使 用 D V 和 I I 指令解 决除 法 问题 存在 一定 的 制 约性 . 文 通过 开 辟 缓 冲 区存 储操 作 数 I DV 本

汇编常用指令

汇编常用指令

汇编常用指令1. 前言汇编语言是一种低级别的计算机语言,它是由一些指令组成的。

指令是一条计算机执行的命令,从基本上讲,这些指令代表着标准的操作,例如加、减、乘、除、移位和比较等。

汇编语言可以通过编写程序来控制一个计算机的行为,这些程序通常被称为汇编程序。

本文将介绍汇编语言中一些常用的指令。

2. 数据传送指令数据传送指令是汇编语言中最基本的指令之一,它主要用来将数据从一个位置传送到另一个位置。

在汇编语言中,数据传送指令通常使用MOV语句来实现。

下面是一些常用的数据传送指令:- MOV AX, BX:将BX中存储的数据传送到AX中。

- MOV AX, [BX]:将BX中存储的地址所指向的数据传送到AX中。

- MOV [BX], AX:将AX中存储的数据传送到BX所指向的地址中。

3. 算术运算指令算术运算指令主要用来执行各种数学运算,例如加法、减法、乘法和除法等操作。

下面是一些常用的算术运算指令:- ADD AX, BX:将BX中存储的数据与AX中存储的数据相加,并将结果存储在AX中。

- SUB AX, BX:将BX中存储的数据从AX中存储的数据中减去,并将结果存储在AX中。

- MUL BX:将AX中存储的数据与BX中存储的数据相乘,并将结果存储在AX中。

- DIV BX:将AX中存储的数据除以BX中存储的数据,并将结果存储在AX和DX中。

4. 位运算指令位运算是一种在二进制数字级别上的运算,它可以执行各种位操作,例如AND、OR、XOR和NOT等操作。

下面是一些常用的位运算指令:- AND AX, BX:将BX中存储的数据与AX中存储的数据按位进行AND运算,并将结果存储在AX中。

- OR AX, BX:将BX中存储的数据与AX中存储的数据按位进行OR 运算,并将结果存储在AX中。

- XOR AX, BX:将BX中存储的数据与AX中存储的数据按位进行XOR运算,并将结果存储在AX中。

- NOT AX:将AX中存储的数据按位进行取反操作。

汇编语言标志位(CF)及一些常用指令

汇编语言标志位(CF)及一些常用指令

汇编语言标志位(CF)及一些常用指令英文翻译:carry 进位 flag标志NV: no overflow OV: overflowUP: up DN:downDI: disable interrupt EI: enable interruptPL: plus NG: negativeNZ: no zero ZR: zeroNA: no assistant carry AC: assistant carryPO: parity odd PE: parity even 奇偶校验NC: no carry CY: carry汇编标志位:标志名标志 1 标志 0 OF (溢出标志) OV NVDF (方向标志) UP DNIF (中断标志) DI EISF (符号标志位) PL NGZF (零标志) NZ ZRAF (辅助进位标志位) NA ACPF (奇偶标志) PO PECF (进位标志) NC CYOF 溢出(是/否) OV OVerflow NV Not oVerflowDF 方向(减量/增量) DN DowN UP UPIF 中断(允许/关闭) EI Enable Interrupt DI Disable Interrupt SF 符号(负/正) NG NeGative PL PLusZF 零(是/否) ZR ZeRo NZ Not ZeroAF 辅助进位(是/否) AC Auxiliary Carry NA Not AuxiliaryPF 奇偶(是/否) PE Parity Even PO Parity OddCF 进位(是/否) CY CarrY NC Not Carry英文解释:NV: no overflow OV: overflowUP: up DN:downDI: disable interrupt EI: enable interruptPL: plus NG: negativeNZ: no zero ZR: zeroNA: no assistant carry AC: assistant carryPO: parity odd PE: parity evenNC: no carry CY: carry先熟悉一下FLAGS标志位:OV、NV即溢出标志位OF=1或0,表示运算结果有无溢出。

实验二算术逻辑运算及移位操作微机原理与接口技术

实验二算术逻辑运算及移位操作微机原理与接口技术

计算内存单元中的这三个数之和,和存放在0013H 单元中,再求出这三个数之积,乘积存放在0014单元中。

试编写完成此功能的汇编语言程序段并上机验证结果(将结果截图)。

MOV BX,0010H MOV [BX],10H MOV [BX+1],04H MOV [BX+2],30H MOV AX,0000H ADD AL,[BX] ADD AL,[BX+1] ADD AL,[BX+2]MOV DS:[0013H],AL MOV AL,[BX]MUL byte ptr [BX+1] MUL byte ptr [BX+2] MOV DS:[0014],AX3.请编写完成下述功能的汇编语言程序段。

上机验证结果,程序运行的最后结果(AX)=?(将结果截图)。

(1) 传送15H 到AL 寄存器;(2) 再将AL 的内容乘以2;(3) 接着传送15H 到BL 寄存器; (4) 最后把AL 的内容乘以BL 的内容。

(1)mov al,15h (2)mov dx,2 mul dx (3)mov bl,15h (4)mul bl实 验 内容 与 实验 结 果4.用移位指令实现将AL寄存器中的无符号数乘以10。

试编写汇编语言程序段,并上机验证结果(将结果截图)。

xor ah,ahshl ax,1mov bx,axshl ax,1shl ax,1add ax,bx5.请编写完成下述功能的汇编语言程序段。

上机验证结果,程序运行后的商=?(将结果截图)。

(1) 传送数据2058H 到DS:1000H 单元中,数据12H 到DS:1002H 单元中; (2) 把DS:1000H 单元中的数据传送到AX 寄存器; (3) 把AX 寄存器的内容算术右移二位;(4) 再把AX 寄存器的内容除以DS:1002H 字节单元中的数; (5) 最后把商存入字节单元DS:1003H 中。

MOV WORD PTR[1000H],2058H MOV BYTE PTR[1002H],12H MOV AX,[1000H] MOV BX,[1002H] SAR AX,1 SAR AX,1 DIV BXMOV [1003H],AX实 验 内容 与 实验 结 果实验内容与实验结果。

汇编语言指令以及伪指令速查手册

汇编语言指令以及伪指令速查手册

汇编语言指令以及伪指令速查手册它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.1. 通用数据传送指令.MOV 传送字或字节.MOVSX 先符号扩展,再传送.MOVZX 先零扩展,再传送.PUSH 把字压入堆栈.POP 把字弹出堆栈.PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.BSWAP 交换32位寄存器里字节的顺序XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )XADD 先交换再累加.( 结果在第一个操作数里 )XLAT 字节查表转换.── BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL )2. 输入输出端口传送指令.IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 )输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,其范围是 0-65535.3. 目的地址传送指令.LEA 装入有效地址.例: LEA DX,string ;把偏移地址存到DX.LDS 传送目标指针,把指针内容装入DS.例: LDS SI,string ;把段地址:偏移地址存到DS:SI.LES 传送目标指针,把指针内容装入ES.例: LES DI,string ;把段地址:偏移地址存到ES:DI.LFS 传送目标指针,把指针内容装入FS.例: LFS DI,string ;把段地址:偏移地址存到FS:DI.LGS 传送目标指针,把指针内容装入GS.例: LGS DI,string ;把段地址:偏移地址存到GS:DI.LSS 传送目标指针,把指针内容装入SS.例: LSS DI,string ;把段地址:偏移地址存到SS:DI.4. 标志传送指令.LAHF 标志寄存器传送,把标志装入AH.SAHF 标志寄存器传送,把AH内容装入标志寄存器.PUSHF 标志入栈.东哥单片机学习网,提供单片机学习开发板,编程器,仿真器,电子元器件,承接电子产品POPF 标志出栈.PUSHD 32位标志入栈.POPD 32位标志出栈.二、算术运算指令───────────────────────────────────────ADD 加法.ADC 带进位加法.INC 加 1.AAA 加法的ASCII码调整.DAA 加法的十进制调整.SUB 减法.SBB 带借位减法.DEC 减 1.NEC 求反(以 0 减之).CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).AAS 减法的ASCII码调整.DAS 减法的十进制调整.MUL 无符号乘法.IMUL 整数乘法.以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),AAM 乘法的ASCII码调整.DIV 无符号除法.IDIV 整数除法.以上两条,结果回送:商回送AL,余数回送AH, (字节运算);或商回送AX,余数回送DX, (字运算).AAD 除法的ASCII码调整.CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)三、逻辑运算指令───────────────────────────────────────AND 与运算.OR 或运算.XOR 异或运算.NOT 取反.TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).SHL 逻辑左移.SAL 算术左移.(=SHL)SHR 逻辑右移.东哥单片机学习网,提供单片机学习开发板,编程器,仿真器,电子元器件,承接电子产品SAR 算术右移.(=SHR)ROL 循环左移.ROR 循环右移.RCL 通过进位的循环左移.RCR 通过进位的循环右移.以上八种移位指令,其移位次数可达255次.移位一次时, 可直接用操作码. 如 SHL AX,1.移位>1次时, 则由寄存器CL给出移位次数.如 MOV CL,04SHL AX,CL四、串指令───────────────────────────────────────DS:SI 源串段寄存器:源串变址.ES:DI 目标串段寄存器:目标串变址.CX 重复次数计数器.AL/AX 扫描值.D标志0表示重复操作中SI和DI应自动增量; 1表示应自动减量.Z标志用来控制扫描或比较操作的结束.MOVS 串传送.( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )CMPS 串比较.( CMPSB 比较字符. CMPSW 比较字. )SCAS 串扫描.把AL或AX的内容与目标串作比较,比较结果反映在标志位.LODS 装入串.把源串中的元素(字或字节)逐一装入AL或AX中.( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )STOS 保存串.是LODS的逆过程.REP 当CX/ECX<>0时重复.REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复.REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复.REPC 当CF=1且CX/ECX<>0时重复.REPNC 当CF=0且CX/ECX<>0时重复.五、程序转移指令───────────────────────────────────────1>无条件转移指令(长转移)JMP 无条件转移指令CALL 过程调用RET/RETF过程返回.2>条件转移指令(短转移,-128到+127的距离内)东哥单片机学习网,提供单片机学习开发板,编程器,仿真器,电子元器件,承接电子产品( 当且仅当(SF XOR OF)=1时,OP1 JA/JNBE 不小于或不等于时转移.JAE/JNB 大于或等于转移.JB/JNAE 小于转移.JBE/JNA 小于或等于转移.以上四条,测试无符号整数运算的结果(标志C和Z).JG/JNLE 大于转移.JGE/JNL 大于或等于转移.JL/JNGE 小于转移.JLE/JNG 小于或等于转移.以上四条,测试带符号整数运算的结果(标志S,O和Z).JE/JZ 等于转移.JNE/JNZ 不等于时转移.JC 有进位时转移.JNC 无进位时转移.JNO 不溢出时转移.JNP/JPO 奇偶性为奇数时转移.JNS 符号位为 "0" 时转移.JO 溢出转移.JP/JPE 奇偶性为偶数时转移.JS 符号位为 "1" 时转移.3>循环控制指令(短转移)LOOP CX不为零时循环.LOOPE/LOOPZ CX不为零且标志Z=1时循环.LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.JCXZ CX为零时转移.JECXZ ECX为零时转移.4>中断指令INT 中断指令INTO 溢出中断IRET 中断返回5>处理器控制指令HLT 处理器暂停, 直到出现中断或复位信号才继续.WAIT 当芯片引线TEST为高电平时使CPU进入等待状态.ESC 转换到外处理器.LOCK 封锁总线.NOP 空操作.STC 置进位标志位.CLC 清进位标志位.CMC 进位标志取反.STD 置方向标志位.CLD 清方向标志位.STI 置中断允许位.CLI 清中断允许位.东哥单片机学习网,提供单片机学习开发板,编程器,仿真器,电子元器件,承接电子产品六、伪指令───────────────────────────────────────DW 定义字(2字节).PROC 定义过程.ENDP 过程结束.SEGMENT 定义段.ASSUME 建立段寄存器寻址.ENDS 段结束.END 程序结束.东哥单片机学习网,提供单片机学习开发板,编程器,仿真器,电子元器件,承接电子产品。

汇编语言程序设计实验篇(emu8086)

汇编语言程序设计实验篇(emu8086)

1.汇编语言程序设计实验篇1.1.汇编系统软件简介Emu8086-Microprocessor Emulator是集源代码编辑器、汇编/反汇编工具以及debug 的模拟器。

它能模拟一台"虚拟"的电脑运行程序,拥有独立的“硬件”,避免访问真实硬件。

该软件兼容Intel的下一代处理器,包括PentiumII、Pentium4。

利用该软件提供的调试工具,能够单步跟踪程序,观察程序执行过程中寄存器、标志位、堆栈和内存单元的内容。

1.1.1创建程序 TEMPLATE程序本章与指令相关的实验都是用COM TEMPLATE类型的程序完成的。

打开emu8086,在“welcome…”对话框中,单击按钮,创建文件。

在“choose code template”对话框中,选择“COM template-simple and tiny executable file format, pure machine code.”后,单击按钮。

在如所示的编辑界面中,在“;add your code here”部分输入相应的指令,第一条指令默认的偏移地址为100h。

输入全部指令后,单击按钮,保存相应的程序段。

2.EXE TEMPLATE程序本章与DOS功能调用和汇编源程序相关的实验都是用EXE TEMPLATE程序完成的。

打开emu8086,在“welcome…”对话框中,单击按钮,创建文件。

在“choose code template”对话框中,选择“EXE template-advanced executable file.header: relocation, checksum.”后,单击按钮。

在如图所示的编辑界面中,已经可以给出了源程序的框架,包含数据段、堆栈段和代码段的定义以及必要的功能调用等,在“add your data here”和“;add your code here”部分可以分别输入相应的变量定义和指令。

移位运算符计算乘法

移位运算符计算乘法
在移位运算中,每一位的移动相当于乘以或除以2的幂次方。

例如,
对于一个二进制数101(十进制为5),左移1位即为1010(十进制为10),相当于5乘以2、右移1位即为10(十进制为2),相当于5除以
2
下面以左移运算符为例,来说明如何使用移位运算符计算乘法:
首先,将要进行乘法的两个数转换为二进制形式。

例如,要计算5乘
以6,将它们转换为二进制分别为101和110。

接下来,确定需要左移的位数。

由于6在二进制中有两位,所以左移
两位即可。

因此,5乘以6等于20。

利用移位运算符进行乘法计算的优点是速度快且效率高。

移位运算的
实质是乘以或除以2的幂次方,而乘以2的幂次方在计算机中可以通过移
动二进制位来实现,速度非常快。

另外,移位运算符还可以应用于其他场景,比如对整数进行除法运算。

右移运算相当于除以2的幂次方。

例如,对于一个二进制数1010(十进
制为10),右移1位即为101(十进制为5),相当于10除以2、右移2
位即为10(十进制为2),相当于10除以4
总结起来,移位运算符可以实现对数值进行乘法或除法运算,其基本
思想是通过移动二进制数的位来改变其值。

利用移位运算符可以快速计算
乘法或除法,提高运算效率。

汇编语言复习题(2)

汇编语⾔复习题(2)汇编语⾔复习题第2章8086CPU寄存器的结构及使⽤1.8086CPU由指令执⾏部件EU和总线接⼝部件BIU两部分组成。

其中EU的功能是控制和执⾏指令,主要由算术逻辑部件ALU、EU控制部件、8个16位寄存器和⼀个标志寄存器FLAGS组成。

BIU的功能是从存储器预取指令和数据,以及所有EU需要的总线操作,实现CPU与存储器和外设间信息传递。

BIU由指令队列、指令指针寄存器、段寄存器、地址加器组成。

2.Intel8086CPU共有14个16位寄存器,它们分别是通⽤寄存器8个即AX、BX、CX、DX、SP、BP、SI、DI,其中能⽤作寄存器间接寻址的寄存有BX、BP、SI和DI,控制寄存器2个即IP、PSW,段寄存器4个即DS、SS、CS和ES它们的含义分别是:其中在编程过程中程序的段基值由汇编程序装⼊的段寄存器是SS和CS,由编程者⽤汇编指令将段基值装⼊的段寄存器是DS 和ES,其具体指令是MOV AX,数据段段/附加数据段名,MOV DS/ES,AX,编程⼈员不能⽤指令去取其值或给其设置给定值的寄存器是IP,但是可以通过某些指令的执⾏⽽⾃动修改其内容,如JMP NEXT指令的功能是将⽬的地址的偏移量送⼊IP。

3.PSW是程序状态字寄存器⼜称为标志寄存器,⽤来反映微处理器在程序运⾏时的某些状态,其中的6个状态标志位分别是OF、SF、ZF、AF、PF和CF,反映了刚执⾏完算术或逻辑运算指令后的某些特征。

三个控制标志位是DF即⽅向标志、IF即中断标志位和TF陷阱标志。

如两个8位的⼆进制数相加其状态标志位中各标志的值是多少?10110101+10011011。

4.8086CPU数据总线16根地址总线是20根能访问的最⼤存储空间是1MB。

第3章存储器的分段1.在8086CPU中存储器的编址原则是按字节编址即每⼀个字节单元是⼀个存储器地址,在源程序中⽤常⽤⼗六进制数或符号来表⽰⼀个存储单元的地址。

汇编语言习题解答

8086/8088汇编语言习题解答第一章、试根据自己使用计算机的经历,列举几个必须使用或最好是使用汇编语言编制程序的事例。

、试完成下列数制间的转换⑴、十进制数转换为8位二进制数十进制:100 对应二进制:01100100B十进制:56 对应二进制:00111000B十进制:111 对应二进制:01101111B十进制: 120 对应二进制:01111000B十进制: 70 对应二进制:01000110B⑵、8位二进制数(无符号数)转换为十进制数二进制:01010101B 对应十进制:85二进制:B 对应十进制:170二进制:B 对应十进制:240二进制:00001111B 对应十进制:15⑶、十进制数转换为十六进制数十进制:40 对应二进制:00101000B十进制:80 对应二进制:01010000B十进制:105 对应二进制:01101001B十进制: 114 对应二进制:01101101B十进制: 207 对应二进制:B、试把下面用补码表示的二进制数转换为对应的十进制真值二进制补码:01111000 对应的十进制值数真值:+120二进制补码:对应的十进制值数真值:-39二进制补码:对应的十进制值数真值:-127二进制补码:对应的十进制值数真值:-120二进制补码:00100111 对应的十进制值数真值:+39二进制补码:对应的十进制值数真值:-16、由键盘输入字符通常都是以该字符的ASCII码形式表示的。

若现在从键盘上输入十六进制数0~F,那么应如何处理才能把十六进制转换为4位二进制数0000~1111.答:将键盘输入的数0~F的ASCII码,每输入一个字符,减去30H后,再存入内存,这样就完成了把从键盘上输入的十六进制ASCII码转换为4位二进制数0000~1111.、试分别判断下列各组数据中哪个数据最大?哪个最小?①、A= B=0,101D C=0,101H②、A=1011B B=1011D C=1011H答:第①组:A=1×21-+1×23-=B=C=1×161-+163-=+=所以A最大,C最小第②组,B最大,A=B最小、现有一个二进制数.若将该数看着是无符号数、原码表示的带符号数、补码表示的带符号数,它对应的十进制数的真值是多少?答:.的无符号数的十进制是:+182;.的原码带符号数的十进制是:-54.补码表示的带符号数的十进制是:+74、下列各组数据均为十进制数,先将各数据转换为补码表示的带符号数,然后用补码的加减运算分别完成下列各小题,并用十六进制数形式回答运算结果。

汇编课第3章寻址方式与指令系统之3 (1)


北京理工大学-张华平-2010
24
① 段内直接短转移 格式:JMP SHORT LABEL 例.
JMP SHORT B1 ;无条件转移到B1标号处 A1: ADD AX,BX B1: …
北京理工大学-张华平-2010
25
② 段内直接转移 格式:JMP LABEL 或: JMP NEAR PTR LABEL
同上
测试并取反由SRC 指定的DST中的位
同上
表3-4 位测试指令
北京理工大学-张华平-2010
10
三、位扫描指令
从386开始增加了位扫描指令,它们包括 BSF、BSR指令,可用于扫描操作数中第一个含 1的位。
北京理工大学-张华平-2010
11
1.顺向扫描指令 BSF 格式:BSF DST,RSC 功能:从右向左扫描RSC操作数中第一个含1的
… B3: SUB AX,CX
… C2 ENDS
北京理工大学-张华平-2010
动画演示
29
2.条件转移指令 执行这类指令时通过检测由前边指令已
设置的标志位确定是否转移,所以它们通常 是跟在影响标志的指令之后。这类指令本身 并不影响标志。
条件转移指令的通用汇编格式: JCC LABEL
北京理工大学-张华平-2010
(设为n),空出的位用操作数OPRD2高端的n位 填充,但OPRD2的内容不变,最后移出的位在进 位标志CF中。
2.双精度右移指令 SHRD 格式:SHRD OPRD1,OPRD2,CNT
北京理工大学-张华平-2010
20
3.6 程序控制指令
本节提供的指令可以改变程序执行的顺 序,控制程序的流向。它们均不影响标志位。
表3-7 检测北单京理个工大条学件-张华标平志-201位0 转移指令 33
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

移位除法运算(汇编) 推荐文章 2010-07-27 10:44:21 阅读508 评论1 字号:大中小 订阅 除法运算的特点:

其特点可归纳如下: ①每次上商都是由心算来比较余数(被除数)和除数的大小,确定商为1还是0。 ②每做一次减法,总是保持余数不动,低位补0,再减去右移后的除数。 ③商符单独处理。如果将上述规则完全照搬到计算机内,实现起来有一定困难,主要问题是: a.机器不能“心算”上商,必须通过比较被除数(或余数)和除数绝对值的大小来确定商值,即|x|-|y|,若差为正(够减)上商1,差为负(不够减)上商0。 b.按照每次减法总是保持余数不动,低位补0,再减去右移后的除数这一规则,则要求加法器的位数必须为除数的两倍。仔细分析发现,右移除数可以用左移余数的办法代替,其运算结果是一样的,但对线路结构更有利。不过此刻所得到的余数不是真正的余数,只有将它乘上2-n才是真正的余数。 c.笔算求商时是从高位向低位逐位求的,而要求机器把每位商直接写到寄存器的不同位也是不可取的。计算机可将每一位商直接写到寄存器的最低位,并把原来的部分商左移一位。

综上所述便可得原码除法运算规则。 2.原码除法:

原码除法和原码乘法一样,符号位是单独处理的。以小数为例: 式中 为x的绝对值,记作x* 为y的绝对值,记作y* 即 商的符号 由两数符号位“异或”运算求得,商值由两数绝对值相除(x*/y*)求得。 小数定点除法对被除数和除数有一定的约束,即必须满足下列条件:

0<|被除数|≤|除数|(这样结果才能为小数) 实现除法运算时,还应避免除数为0或被除数为0。前者结果为无限大,不能用机器的有限位数表示;后者结果总是0,这个除法操作等于白做,浪费了机器时间。至于商的位数一般与操作数的位数相同。 原码除法中由于对余数的处理不同,又可分为恢复余数法和不恢复余数法(加减交替法)两种。

(1)恢复余数法。恢复余数法的特点是:当余数为负时,需加上除数,将其恢复成原来的余数。(然后再执行左移一位后减去除数的运算) 由上所述,商值的确定是通过比较被除数和除数的绝对值大小,即x*-y*实现的, 而计算机内只设加法器, 故需将x*-y*操作变为[x*]补+[-y*]补的操作。

例:已知:x=-0.1011,y=-0.1101,求:[x÷y]原 解:由x*=0.1011,[x]原=1.1011 y*=0.1101,[-y]补=1.0011,[y]原=1.1101 商值的求解过程如下: 被除数(余数) 商 说 明 0.1011 + 1.0011 0.0000 +[-y*]补(减去除数)

1.1110 + 0.1101 0 余数为负,上商0 恢复余数+[y*]补

0.1011 1.0110 + 1.0011 0 被恢复的被除数 ← 1位 +[-y*]补(减去除数)

0.1001 1.0010 + 1.0011 01 01 余数为正,上商1 ← 1位 +[-y*]补(减去除数)

0.0101 0.1010 +1.0011 011 011 余数为正,上商1 ← 1位 +[-y*]补(减去除数)

1.1101 + 0.1101 0110 余数为负,上商0 恢复余数+[y*]补

0.1010 1.0100 + 1.0011 0110 被恢复的被除数 ← 1位 +[-y*]补(减去除数)

0.0111 01101 余数为正,上商1 故商值为0.1101 商的符号位为 由此可见,共上商5次,第一次上的商在商的整数位上,这对小数除法而言,可用它作溢出判断。即当该位为“1”时,表示此除法为溢出,不能进行,应由程序进行处理;当该位为“0”时,说明除法合法,可以进行。 在恢复余数法中,每当余数为负时,都需恢复余数,这便延长了机器除法的时间,操作也很不规则,对线路结构不利。加减交替法可克服这些缺点。

(2)加减交替法。加减交替法又称不恢复余数法,可以认为它是恢复余数法的一种改进算法。

问题: 余数为负时,怎样实现恢复余数的操作? 答案:把余数加上除数即可。 分析原码恢复余数法得知:(X*为被除数X的绝对值,Y*为除数Y的绝对值) 当余数Ri>0时,可上商“1”,再对Ri左移一位后减除数,即2Ri-y*。 当余数Ri<0时,可上商“0”,然后再做Ri+y*(完成恢复余数的运算),再做2(Ri+y*)-y*,也即2Ri+y*【先恢复余数,再左移一位后减去除数。】。 可见,原码恢复余数法可归纳为: 当余数Ri>0时,商上“1”,做2Ri-y*的运算; 当余数Ri<0时,商上“0”,做2Ri+y*的运算。 这里已看不出余数的恢复问题了,而只是做加y*或减y*,因此,一般把它叫做加减交替法或不恢复余数法。

例:已知:x=-0.1011,y=-0.1101,求:[x÷ y]原 解:[x]原=1.1011, x*=0.1011 [y]原=0.1101, y*=0.1101, [-y*]补=1.0011 商值的求解过程如下表所示: 被除数(余数) 商 说 明

0.1011 + 1.0011 0.0000 +[-y*]补(减除数)

1.1110 1.1100 + 0.1101 0 0 余数为负,上商0 ← 1位 +[y*]补 (加除数)

0.1001 1.0010 + 1.0011 01 01 余数为正,上商1 ← 1位 +[-y*]补(减除数)

0.0101 0.1010 + 1.0011 011 011 余数为正,上商1 ← 1位 +[-y*]补(减除数)

1.1101 1.1010 + 0.1101 0110 0110 余数为负,上商0 ← 1位 +[y*]补 (加除数)

0.0111 01101 余数为正,上商1 商的符号位为 所以 分析此例可见,n位小数的除法共上商n+1次,第一次商用来判断是否溢出。倘若比例因子选择恰当,除数结果不溢出,则第一次商肯定是0。如果省去这位商,只需上商n次即可,此时除法运算一开始应将被除数左移一位减去除数,然后再根据余数上商。 (3)原码加减交替法所需的硬件配置。下图是实现原码加减交替除法运算的基本硬件配置框图。

图中A、X、Q均为n+1位寄存器,其中A存放被除数的原码,X存放除数的原码。移位和加控制逻辑受Q的末位Qn控制。(Qn=1作减法,Qn=0作加法),计数器C用于控制逐位相除的次数n,GD为除法标记,V为溢出标记,S为商符。

(4)原码加减交替除法控制流程。下图为原码加减交替除法控制流程图。

除法开始前,Q寄存器被清0,准备接收商,被除数的原码放在A中,除数的原码放在X中,计数器C中存放除数的位数n。除法开始后,首先通过异或运算求出商符,并存于S。接着将被除数和除数变为绝对值,然后开始用第一次上商判断是否溢出。若溢出,则置溢出标记V为1,停止运算,进行中断处理,重新选择比例因子:若无溢出,则先上商,接着A、Q同时左移一位,然后再根据上一次商值的状态,决定是加还是减除数,这样重复n次后,再上最后一次商(共上商n+1次),即得运算结果。

对于整数除法,要求满足以下条件: 0<|除数|≤|被除数| 因为这样才能得到整数商。通常在做整数除法前,先要对这个条件进行判断,若不满足上述条件,机器发出出错信号,程序要重新设定比例因子。 上述讨论的小数除法完全适用于整数除法,只是整数除法的被除数位数可以是除数的两倍,且要求被除数的高M位要比除数(n位)小,否则即为溢出。如果被除数和除数的位数都是单字长,则要在被除数前面加上一个字的0,从而扩展成双倍字长再进行运算。

补码的运算! 与补码乘法类似,也可以用补码完成除法操作。补码除法也分为恢复余数法和加减交替法,后者用得较多,在此只讨论加减交替法。

(1)补码加减交替法运算规则。补码除法其符号位和数值部分是一起参加运算的,因此在算法上不像原码除法那样直观,主要需解决三个问题:第一,如何确定商值;第二,如何形成商符;第三,如何获得新的余数。

①商值的确定。

欲确定商值,必须先比较被除数和除数的大小,然后才能求得商值。 a. 比较被除数(余数)和除数的大小。补码除法的操作数均为补码,其符号又是任意的,因此要比较被除数[x]补和除数[y]补的大小就不能简单地用[x]补减去[y]补。实质上比较[x]补和[y]补的大小就是比较它们所对应的绝对值的大小。同样在求商的过程中,比较余数[Ri]补与除数[y]补的大小,也是比较它们所对应的绝对值。这种比较的算法可归纳为以下两点: 第一,当被除数与除数同号时,做减法,若得到的余数与除数同号,表示“够减”,否则表示“不够减”。 第二,当被除数与除数异号时,做加法,若得到的余数与除数异号,表示“够减”,否则表示“不够减”。 此算法如下表所示。

比较[x]补与[y]补的符号 求余数 比较 [Ri]补与[y]补的符号 同号 [x]补-[y]补 同号,表示“够减” 异号 [x]补+[y]补 异号,表示“够减” b.商值的确定。补码除法的商也是用补码表示的,如果我们约定商的末位用“恒置1”的舍入规则,那么除末位商外,其余各位的商值对正商和负商而言,上商规则是不同的。因为在负商的情况下,除末位商以外,其余任何一位的商与真值都正好相反。(我的分析,因为这样所求得的商为正数,因为二进制只有0和1,所以商为负数时一定是和这种方法所求结果相反--------利用求补运算,末位取反后再+1仍为1)因此,上商的算法可归纳为以下两点:

第一,如果[x]补与[y]补同号,商为正,则“够减”时上商“1”。“不够减”时上商“0”(按原码规则上商)。 第二,如果[x]补与[y]补异号,商为负,则“够减”时上商“0”,“不够减”时上商“1”(按反码规则上商)。 结合比较规则与上商规则,使可得商值的确定办法,如下表所示。

[x]补与[y]补 [R]补与[y]补 商

同号 同号,表示“够减” 1 异号,表示“不够减” 0 异号 异号,表示“够减” 0 同号,表示“不够减” 1 进一步简化,商值可直接由下表确定。(均是在够减时判断的) [x]补与[y]补 商值

同号 上1 异号 上0 ②商符的形成。在补码除法中,商符是在求商的过程中自动形成的 在小数定点除法中,被除数的绝对值必须小于除数的绝对值,否则商大于1而溢出。因此,当[x]补与[y]补同号时,[x]补-[y]补所得的余数[R0]补与[y]补异号,商上“0”,恰好与商的符号(正)一致;当[x]补与[y]补异号时,[x]补+[y]补所得的余数[R0]补与[y]补同号,商上“1”,这也与商的符号(负)一致。可见,商符是在求商值过程中自动形成的。 此外,商的符号还可用来判断商是否溢出。例如,当[x]补与[y]补同号时,若[R0]补与[y]补同号,上商“l”,即溢出。当[x]补与[y]补异号时,若[R0]补与[y]补异号,上商“0”,即溢出。 当然,对于小数补码运算,商等于“-1”应该是允许的,但这需要特殊处理,为简化问题,这里不予考虑。

相关文档
最新文档