每天一个汇编指令&&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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 狗狗后腿内八字怎么办 快走后小腿粗了怎么办? 猫的嘴巴烂了怎么办 苹果8丢了已关机怎么办 肚子吃多了难受怎么办 喝水喝的肚子胀怎么办 肚子吃撑了难受怎么办 肚子撑得想吐怎么办 吃饭吃的太饱怎么办 吃饭吃的太撑怎么办 跑步迈不开步子怎么办 踏步走步子反了怎么办 微信不支持计步怎么办 肝癌二次介入后头晕心慌怎么办 跑步跑得胃疼怎么办 如果世界上的猪都死了怎么办 我和我老婆吵架怎么办 我和我老婆吵架了怎么办 智障人士父母死后怎么办 依赖性太强的人怎么办 高考只有一门写准考证号怎么办 ps做动画不流畅怎么办 ff15引擎剑卖了怎么办 fgo从者满了怎么办 游泳池的水喝了怎么办 月球没有水怎么办秒懂 请了新财神旧的怎么办 报警校体检没过怎么办 ae中建立了文本打不出字怎么办 宝宝3岁内八字怎么办 一岁半宝宝走路内八字怎么办 一岁宝宝走路内八字怎么办 宝宝1岁了内八字怎么办 宝宝学走路内八字怎么办 人胖走路磨腿怎么办 2岁半宝宝内八字怎么办 大狗跑步累倒怎么办? 拉小提琴的姿势不正确怎么办 屁股摔倒了很痛怎么办 腿摔倒了破了怎么办 骑车摔倒腿肿了怎么办