计算机学院2008级计算机专业用专业基础课、限选课软件开发的一个组成部分一种低级语言的程序设计高级语言程序设计的扩展课程介绍第一章基础知识设问:1.为什么要学习汇编语言?2.什么是汇编语言?3.为什么要用十六进制数?4.怎样区别计算机中数的含义?本章重点汇编语言基本概念十六进制数数的补码表示BCD码第一章基础知识学习汇编语言,重要的是掌握如何通过汇编指令和程序来控制计算机各个组成部件工作,完成一系列任务。学会了汇编语言,就能够在CPU的寄存器级上进行控制和操作,掌握直接对计算机硬件编程的方法。本章介绍学习汇编语言所需的基本知识,并通过具体的例子为读者建立起汇编语言的初步概念。计算机以二进制数为基础。那么控制计算机工作的机器指令就由二进制数构成,而机器指令的集合称之为机器语言。如果想让计算机工作,就要写出一系列二进制的机器码。1.1汇编语言基本概念二进制表示十六进制表示101110000010001100000000B82300000001010001101100000000051B00101000110000010000000000A30400例如计算Z=35+27,写成机器指令为:用指令助记符表示如下:MOVAX,35ADDAX,27MOVZ,AX特点:简单直观这些助记符就是汇编指令,用汇编指令编写的程序称为汇编语言。汇编语言是一种符号化的机器语言。汇编语言既便于程序员编写程序,又保留了机器语言可直接而迅速地控制机器的长处。汇编语言是直接控制计算机工作的最简便的语言。汇编语言的主要特点:汇编语言程序与处理器指令系统密切相关程序员可直接、有效地控制系统硬件形成的可执行文件运行速度快、占用主存容量少汇编语言的优点:直接控制计算机硬件部件可以编写在“时间”和“空间”两方面最有效的程序汇编语言的优点使得它在程序设计中占有重要的位置,是不可被取代的汇编语言的缺点:与处理器密切有关需要熟悉计算机硬件系统、考虑许多细节编写繁琐,调试、维护、交流和移植困难汇编语言有三种指令形式:汇编指令、伪指令和宏指令。汇编指令可以翻译成二进制的机器指令代码。伪指令和宏指令不能翻译成机器指令,它们是在汇编期间为汇编程序提供相关信息使用的。1.2计算机中数的表示进制数的三要素:基数、权、进位规则是描述一种进制数的三个要素。十进制数二进制十六进制各进制数值对照表各进制间的转换举例举例举例图表练习1.2.1进制转换十进制数数码为:0、1、2、3、4、5、6、7、8、9基数:10权:10的N-1次方进位规则:逢十进一例如:十进制数257.36=2×102+5×101+7×100+3×10-1+6×10-2二进制数码为:0、1基数:2权:2的N-1次方进位规则:逢二进一例如:二进制数1101.01=1×23+1×22+0×21+1×20+0×2-1+1×2-2十六进制数码为:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F基数:16权:16的N-1次方进位规则:逢十六进一例如:十六进制数3A6.52=3×162+A×161+6×160+5×16-1+2×16-2进制数据对照表数制间的转换关系按位权展开求和整数除以16取余小数乘以16取整八进制数十六进制数二进制数十进制数4位化1位1位化4位按位权展开求和3位化1位1位化3位整数除以8取余,小数乘以8取整整数除以2取余小数乘以2取整按位权展开求和数制间的转换关系在计算机中,数据都是以二进制表示的,因此采用2的n次方形式描述数的权值大小比较方便。十进制数转换为二进制数整数转换采用除2取余法:用2不断地去除要转换的数,直到商为0。再将每一步所得的余数,按逆序排列,便可得转换结果。小数转换采用乘2取整法:每次用2与小数部分相乘,取乘积的整数部分,再取其小数部分乘2直到小部分为0。将所取整数顺序放在小数点后即为转换结果。例:十进制数58.125转换为二进制数整数部分,将58转换成二进制数,逐次除2取余:2582290214127023121101得到的余数从后至前依次为:1、1、1、0、1、0可得到:(58)10=(111010)2小数部分,将0.125转换为二进制小数,逐次乘2取整:可得:(0.125)10=(0.001)2即58.125=(111010.001)B0.125×20.250×20.50×21.00例:十进制数58.125转换为十六进制数整数部分,将58转换成十六进制数,逐次除16取余:1658163A03得到的余数从后至前依次为:1、1、1、0、0、1可得到:58=(3A)H小数部分,将0.125转换为十六进制小数,逐次乘16取整:0.125×162.0可得:(0.125)10=(0.2)16即58.125=(3A.2)H*练习:125=()2*200=()2*33.5=()2*68.26=()2例1:二进制数101101.1B转换为十进制数二进制数用多项式展开写成:101101.1B=1×25+0×24+1×23+1×22+0×21+1×20+1×2-1=45.5D例2:二进制数10110.1B转换为十六进制数二进制数整数从小数点左边开始每4位一组,小数从小数点右边开始每4位一组,不够位数以0补齐:101101.1B=00101101.1000=2D.8H例3:十六进制数39CH转换为十进制数按权展开:39CH=3×162+9×161+12×160=924D例4:十六进制数39CH转换为二进制数39CH=001110011100B练习:11001101B=()D=()H123H=()DFFH=()D1024D=()H100D=()H1.2.2进制运算二进制运算加法规则:0+0=00+1=11+0=11+1=0(同时向高位进1)减法规则:0-0=00-1=1(同时向高位借1)1-0=11-1=0乘法规则:0×0=00×1=01×0=01×1=1除法规则:0÷1=01÷1=1例:10001011B+01001001B=11010100B十六进制运算十六进制按照逢十六进一原则进行运算。在汇编语言中,只要求掌握十六进制的加、减、乘运算。例13F45H+2194H=60D9H例268C5H-3428H=349DH例312H×16H=18CH练习:十六进制的加、减、乘法3F45H+2194H=669BH-23C6H=341AH-25H=5FH*6H=12F4H*1000H=12H*16H=12H*16D=12H*10H=12H*10D=1.2.3补码运算数的补码表示补码运算补码的表示范围无符号数表示的范围符号位扩展1.机器数与真值在计算机中表示正负号的最简单方法是约定用0表示“+”,用1表示“-”。例:+101——0101-101——1101真值:适合于计算机表示的带有“+”、“-”号的二进制数;机器数:真值的“+”、“-”号数值化后所得到的计算机实际能表示的数。机器数有三种码:原码、反码、补码一、数的补码表示机器数应满足的要求:1.机器数必须能为计算机所表示。2.机器数与真值的转换要简单,辨认要直观。3.机器数的运算规则要简单。(1)原码原码将最高位作为符号位,正数为0,负数为1,其余7位作为数值位。(3)补码正数的补码与正数的原码一样。负数的补码,符号位为1,数值位在原码的基础上取反加1。(2)反码正数的反码与正数的原码一样。负数的反码,符号位为1,数值位在原码的基础上取反。注:对负数补码的数值位再取反加1,且符号位变为“-”,就得到其真值。正数直接从补码得到真值。字节:8位二进制数。如00000101B或表示成05H10000101B或85H。字:16位二进制数,等于2字节。如1100010111010110B或C5D6H。双字:32位二进制数,又称为双精度数,等于4字节。如23456789H。在计算机中规定采用字节、字、双字等单位来表示数据。例1十进制数+5和-5分别表示成二进制数原码、反码和补码。[+5]原=[+5]反=[+5]补=00000101B[-5]原=10000101B[-5]反=11111010B[-5]补=11111011B(1)原码:[x]原=01101010B=6AH[y]原=11101010B=EAH(2)反码:正数的反码等于正数的原码,负数为原码求反(符号位不变)[x]反=[x]原=01101010B=6AH[y]反=10010101B=95H(3)补码:正数的补码等于正数的原码,负数为原码求反加1(符号位不变)[x]补=[x]原=01101010B=6AH[y]补=10010110B=96H例2变量x、y是十进制数。x=106,y=-106,求其原码、反码和补码。例3给出补码,求其十进制真值。00100010B=+3410010011B=-1101101B=-109练习:(1)求补码,并用二进制和十六进制表示:X1=95=B=HX2=-100=X3=-127=X4=-39=X5=-128=X6=-1=(2)从补码求真值,用十进制表示:01101101B=11100111B=10000011B=00111100B=2.补码运算例1已知x=13,y=6,用补码计算x-y步骤如下:(1)先将x和y分别用8位二进制表示:x=00001101B,y=00000110B(2)求出正数的补码[x]补=0,0001101B[y]补=0,0000110B(3)根据补码运算规则[x-y]补=[x]补+[-y]补(4)计算-y的补码,即对+y的补码再求补[-y]补=1,1111010B(5)减法运算变为补码的加法[x]补=0,0001101B+[-y]补=1,1111010B[x-y]补=10,0000111B丢掉符号进位求得x-y=00000111Bn位二进制数补码的范围可用公式-2n-1~+2n-1–1计算。(1)8位二进制补码的范围:00000000B~01111111B----10000000B~111111111B00H~7FH----80H~FFH0~127D-128D~-1D十进制表示的范围:-128~+127,-27~+27–1(2)16位二进制补码的范围:十进制表示的范围:-32768~+32767,-215~+215–1(3)8位无符号数的范围:2n–100000000~11111111B0~255D(4)16位无符号数的范围:0000000000000000~1111111111111111B0~65535D二、数的表示范围1、8位扩展到16位01110110=76H=0000000001110110=0076H10001010=8AH=1111111110001010=FF8AH2、16位扩展到32位0076H=00000076HFF8AH=FFFFFF8AH三、符号位扩展在汇编语言中,常常需要把字节数据变为字、字数据变为双字,以满足计算和指令格式的要求。练习:将字节扩展为字,字扩展到双字。98H→8045H→3AH→F028H→计算机中,数据除采用按“值”表示外,还采用按“形”表示,这就是对数据进行编码。所谓编码,就是用一定规则组合而成的若干位二进制码来表示数或字符(字母及符号)。常用的编码有十进制数的常用代码、可靠性代码及字符代码等。1.3编码十进制数编码BCD码可靠性编码ASCII码1.3.1BCD码1.十进制数的常用代码表十进制数8421码2421码余3码00000000000111000100010100200100010010130011001101104010001000111501011011100060110110010017011111011010810001110101191001111111002.压缩的BCD码和非压缩的BCD码BCD码又可以表示成压缩的BCD码和非压缩的BCD码,可根据需要选定。(1)压缩的BCD码用1字节二进制数表示两个8421码,则称为压缩的BCD码。例如:85D=10000101BCD364D=0000001101100100BCD(2)非压缩的BCD码1字节二进制数只表示一个8421码,