每天一个汇编指令&&div
来源:互联网 发布:淘宝网百度百科 编辑:程序博客网 时间:2024/04/29 16:24
除法指令的两种用法
用法一:16位二进制数除以8位二进制数
在这种情况下,被除数必须在寄存器AX中,除数可以由八位寄存器或者八位内存单元提供,指令执行后,商在寄存器AL中,余数在寄存器AH中,比如:div cldiv byte [0x0023];第一条:加入ax中的内容是0x0005,cl中的内容为0x02,执行指令后,AL的内容为0x02,AH中的余数为0x01第二条:先将段寄存器DS的值左移四位,加上偏移地址0x0023形成物理地址,在此取得一个字节,作为除数同寄存器AX做一次除法
用法二:32位二进制数除以16位的二进制数
由于16位处理器无法直接提供32位被除数,故要求被除数高16位在DX中,低16位在AX中,通常用 “DX:AX”来描述32位被除数。 同时,除数可以由16位通用寄存器或者内存单元提供,指令执行后,商在AX中,余数在DX中,比如下面的指令: div cx;被除数为DX:AX div word [0x0230]
idiv指令
对处理器来说,数据是没有正负之分的,正负只是我们根据我们自己的用途把它看作正数或是负数,而div指令严格来说指的是无符号数指令,这个指令只适用于无符号数;比如 mov ax,0x0400 mov bl,0xf0 div bl;从无符号数角度来说,0x0400十进制表示俄日1024,0xf0表示为十进制数240,那么寄存器AL中的商则为0x04;但从有符号数角度来说,0x0400等于十进制数1024,0xf0等于十进制数240,相除之后,寄存器AL中的结果应该是0xc0,因其最高位为‘1’,故为负数,即十进制数为-64;为解决这个问题,处理器专门提供了有符号数除法指令idiv,专门用来计算有符号数;如下: mov ax,0x0400 mov bl,0xf0 idiv bl;执行后AL中的内容为0xc0但是用idiv需要小心,比如0xf0c0除以0x10,也就是十进制-3094除十进制16,你的做法可能是这样 mov ax,0xf0c0 mov bl,0x10 idiv bl以上代码是16位二进制除法,结果在寄存器AL中,除法结果应该是十进制的-244,但是很遗憾,八位寄存器AL有符号数表示范围为-128~127,必然会溢出导致结果不正确,为此会用32位除法替代如下: xor dx,dx mov ax,0xf0c0 mov bx,0x10 idiv bl很遗憾这依然是错的,十进制数-3904的16位二进制形式和32位二进制形式是不同的,前者为0xf0c0,后者是0xfffff0c0,还记得cwd吗?应该这么写: mov ax,0xf0c0 cwd;将ax中的有符号数扩展为dx:ax mov bx,0x10 idiv bx
小结
主动权在你自己手上,在写程序的时候你要做什么,什么目的,你自己最清楚,无符号数计算,必须用di指令,如果你在做有符号数计算,就应当使用idiv指令。
0 0
- 每天一个汇编指令&&div
- 汇编:div指令讲解
- 汇编:div指令讲解
- 汇编中div指令使用
- 关于汇编的div指令
- 一天一个汇编指令&& mov
- 一天一个汇编指令&&jcc指令簇
- 汇编学习-转移指令和mul,div指令
- 每天一个linux指令——man
- 每天一个linux指令——chgrp
- 每天一个linux指令——chown
- 每天一个linux指令——cd
- 一个Hello World的Arm汇编指令
- 汇编加减乘除指令 add adc sub sbb mul div
- Win32 汇编 - 乘除指令: MUL、IMUL、DIV、IDIV
- 汇编指令
- 汇编指令
- 汇编指令
- PHP数组
- react classnames
- Struts2、Spring、Hibernate 高效开发的最佳实践
- 单例设计模式
- No enclosing instance of type TextRunnable is accessible. Must qualify the allocation with an enclo
- 每天一个汇编指令&&div
- maven学习笔记
- java之泛型(Generic)
- Python中的汉诺塔递归算法
- MySQL数据库分表的3种方法
- mysql 优化--定位慢查询
- Divide Two Integers
- 简单理解SSH登录
- 数据连接池的工作机制