Intel8086处理器使用NASM汇编语言实现操作系统08-关于负数的相关处理idiv/cbw/cwde/cdqu/cwd/cdq/cdo/
很多人都知道一个有符号的数,最高位是1,则表示负数,最高位是0,则表示正数,如果假设我的CPU是4位CPU,那么对于1001这个数,是表示+9,还是表示-7呢???
其实CPU并不关心这个数是+9还是-7,因为这个数字是个结果,至于它代表正还是负,这取决于编程人员自身,换句话说这也取决于使用的编译器,或者说取决于你使用的高级编程语言
无论0B1001表示正还是负,它+1之后,值都是0B1010,它-1之后,值都是0B1000,所以结果是没问题的,CPU就负责算减法还是加法就可以了,至于结果,你希望它是正还是负??
下面是一段Java的代码,很明显这段代码的行1是错误的,编译的时候就过不去,直接报错,而行2就是正确的,这说明在Java开发语言中,int类型是有符号数,那么既然是有符号数,则必须将32位的int类型中的最高位表示正负,而剩下31位,用来存放数字,所以在JDK处理的时候,JDK是知道自己有正负功能的,所JDK会判断最高位是0还是1(正还是负),这与CPU和操作系统没有关系,而是JDK来决定这个数是正还是负
public static void main(String[] args) {int a=4294967295; // 行1,4294967295=2的32次方-1int b=2147483647; // 行2,4294967295=2的31次方-1
}
所以你一定要明白,CPU和操作系统是不关心内存(或寄存器)中的值是正还是负的,正负只是程序员强加的概念,因为不管正负,最终的二进制结果都是相同的,CPU只是单纯执行指令,获取结果,至于如何使用这个结果,是程序员自己决定,很明显上述使用了JAVA举例,你应该明白Java是如何使用这个结果的,当然其他语言也是一样的
add加法指令
mov ax,666
add ax,3 ;cpu执行完本行,ax中的值是669
sub减法指令
mov ax,666
sub ax,3 ;cpu执行完本行,ax中的值是663
idiv负数除法指令
在这篇文章中已经使用了div(除法)指令来编写程序,不过div是正数的除法指令,很明显与加减法不同,乘除法并不能使用相同的指令,因为二进制结果不一样,我们同样假设现有一个4位的CPU,若现在内存中(或寄存器)的值是1001,用这个值除以十进制的2,那么CPU应该调用div(正数)指令执行除法,还是使用idiv(负数)指令执行除法????
在上面的Java例子中,我们已经非常明确的说过,这取决于程序员(或编译器),在这个例子中,如果是JAVA等其他高级语言,那么会调用idiv指令,因为它们都是支持正负的,并且约定最高位如果是1,则表示负数,所以会调用idiv指令
mov ax,0B1001
mov bh,2
idiv bh ;用ax/bx,商放到al中,余数在ah中,与div没什么不同,只是结果不一样
到这里文章基本结束,下面介绍几个拓展有符号数指令,假设有如下代码
mov dx,FFFF ;注意是idiv bx,被除数高位会在dx,低位在ax中,因为我用不到dx,所以先将所有的位都置1(因为是负数)
mov ax,0D-7 ;10进制-7
mov bx,2
idiv bx
从上面的代码可以看到mov dx,1
这行需要我们进行思考,然后再写出这行代码,而且有一个比mov更快速的指令,也就是下面这些
cbw: 将AL中有符号的数拓展到AX,,如果AL中的值是-7,则cbw执行完毕,AX中的值是FFF9
cwde: 将AX中有符号的数拓展到EAX
cdqe: 将EAX中有符号的数拓展到RAX
cwd: 将AX中的有符号数扩展到DX:AX,如果AX中的值是-7,则cwd执行完毕,DX中的值是FFFF
cdq: 将EAX中的有符号数扩展到EDX:EAX
cdo: 将RAX中的有符号数扩展到RDX:RAX
Intel8086处理器使用NASM汇编语言实现操作系统08-关于负数的相关处理idiv/cbw/cwde/cdqu/cwd/cdq/cdo/相关推荐
- Intel8086处理器使用NASM汇编语言实现操作系统15-段的定义section/vstart和align语法
vstart用法 如果一个程序有a,b两个段,那么如下的程序,最后2个字节存放的是b_label距离程序起始位置段a中mov ax,1的偏移量 section a ;NASM汇编中使用section关 ...
- Intel8086处理器使用NASM汇编语言实现操作系统10-硬盘读取(in/out)
本示例遇到的新汇编指令in,out out 正确写法 out 0xf3,ax ;将ax里的值放到0xf3端口,且只能是ax,al,eax out dx,ax ;第1操作数如果是寄存器,则必须使用dx ...
- Intel8086处理器使用NASM汇编语言实现操作系统04-实模式-屏幕显示不定长度的字符串(cmp/je)
本示例遇到的新汇编指令cmp,je cmp正确写法 cmp eax,666 ;用eax里的值减去666,如果值为0,则将ZR(ZF)标志位=1;如果发生借位或进位,CF(CY)标志位=1;如果溢出,则 ...
- Intel8086处理器使用NASM汇编语言实现操作系统09-关于数组复制的实现/movsb/movsw/cld/std/rep
本文介绍movsb和movsw指令,它是C++中memcpy函数的实现,在Java语言的ArrayList实现类中就使用了该指令,不过在Java中的方法是System.arraycopy方法 首先要了 ...
- NASM汇编语言与计算机系统13-段的定义/vstart和align语法
vstart用法 如果一个程序有a,b两个段,那么如下的程序,最后2个字节存放的是b_label距离程序起始位置段a中mov ax,1的偏移量 section amov ax,1mov ax,2a_l ...
- NASM汇编语言与计算机系统03-实模式-屏幕显示HelloWorld(mov,jmp,time,dd,dw,$$)
本文涉及到的汇编指令mov,jmp,times(独有),dd(独有),dw (独有),$,$$ dd/dw times 10 dd 0 ;dd表示一个双字,在8086下占用4个字节 times 10 ...
- NASM汇编语言与计算机系统02-实模式-显存原理
显卡以高频的刷新速度一直不停的扫描显存中的数据,将显存中的数据显示到屏幕上 显卡有两种模式 1.文本模式:为了方便叙述,本文的代码示例采用文本模式 2.图形模式 对于CPU来说,显存也是内存,显存的地 ...
- NASM汇编语言与计算机系统01-环境搭建
使用的程序有4个,分别是 1.Nasm汇编编译器 2.Sublime文本工具(一会需要安装NASM插件) 3.VirtualBox虚拟机 4.Bochs虚拟机调试器(一个带有调试功能的虚拟机) 1.安 ...
- NASM汇编语言与计算机系统13-段的定义vstart和align语法
vstart用法 如果一个程序有a,b两个段,那么如下的程序,最后2个字节存放的是b_label距离程序起始位置段a中mov ax,1的偏移量 section amov ax,1mov ax,2a_l ...
最新文章
- c 清除 html标签,13.4. 去除HTML的标签tag:htmlRemoveTag
- tensorflow.reshap(tensor,shape,name)的使用说明
- C# 学生成绩管理系统 完整版
- 花5分钟时间来了解一下高性能网关Kong会有意外收获
- 百度分布式配置管理平台-Disconf
- 视觉SLAM十四讲学习笔记-第三讲-旋转矩阵和Eigen库
- 基于Linux和MiniGUI的嵌入式系统软件开发指南(五)
- Android_组件的显示与隐藏
- LIO-SAM探秘第三章之代码解析(四) --- mapOptmization.cpp (2)
- 康拓电梯卡延期与通楼修改教程
- MQTT.fx工具测试mqtt
- 用PS自己制作一寸证件照照片
- mui中双webView的刷新
- 接口测试之postman
- 解决服务器上中文显示乱码问题
- XMind 2022 for Mac(思维导图软件)中文免费版
- 全息网御上榜《CCSIP 2022中国网络安全产业全景图》
- python能否取代excel_行,Python玩大了!​取代Excel,程序员:太牛!你怎么看?...
- 申报指南|教你如何优雅地报名、提交项目申请书
- minMaxLoc用法