1汇编语言程序设计2课程培养目标1.熟练掌握8086/8088指令系统的常用指令及寻址方式2.掌握汇编语言程序编程及其程序设计的基本方法和技巧。3.熟练掌握汇编语言程序的上机调试和运行。3课程安排课时安排:共48课时,36课时上课,12课时上机教学形式:整个教学过程由授课、实验、和自学三个环节组成。实验、作业、平时占本课程总学分的20%—30%,期末理论考试占70%—80%学分。前序课程:计算机文化基础后序课程:微机原理与接口技术、操作系统、单片机等教材:《汇编语言程序设计教程》刘恩海天津大学出版社4第1章基础知识1.1汇编语言及特点1.2数据表示51.1汇编语言及特点1.1.1机器语言1.1.2汇编语言1.1.3高级语言1.1.4汇编语言的特点61.1.1机器语言计算机能够直接识别的数据是由二进制数0和1组成的代码。机器指令就是用二进制代码组成的指令,一条机器指令控制计算机完成一个基本操作。用机器语言编写的程序是计算机惟一能够直接识别并执行的程序,而用其他语言编写的程序必须经过翻译才能变换成机器语言程序,所以,机器语言程序被称为目标程序。71.1.2汇编语言为了克服机器语言的缺点,人们采用助记符表示机器指令的操作码,用变量代替操作数的存放地址等,这样就形成了汇编语言。汇编语言是一种用符号书写的、基本操作与机器指令相对应的、并遵循一定语法规则的计算机语言。用汇编语言编写的程序称为汇编源程序。但是,汇编语言源程序要翻译成机器语言程序才可以由计算机执行。这个翻译的过程称为“汇编”,这种把汇编源程序翻译成目标程序的语言加工程序称为汇编程序。81.1.3高级语言汇编语言虽然较机器语言直观,但仍然烦琐难懂。于是人们研制出了高级程序设计语言。高级程序设计语言接近于人类自然语言的语法习惯,与计算机硬件无关,易被用户掌握和使用。目前广泛应用的高级语言有多种,如BASIC、FORTRAN、PASCAL、C、C++等等。9机器语言10000000B表示“加法”操作汇编语言高级语言A=A+B例:求解A+BADDA,B表示执行A+BA101.1.4汇编语言的特点(1)汇编语言与处理器密切相关。(2)汇编语言程序效率高。(3)编写汇编语言源程序比编写高级语言源程序烦琐。(4)调试汇编语言程序比调试高级语言程序困难。11汇编语言的主要应用场合:(1)程序执行占用较短的时间,或者占用较小存储容量的场合。(2)程序与计算机硬件密切相关,程序直接控制硬件的场合。(3)需提高大型软件性能的场合。(4)没有合适的高级语言的场合。121.2数据表示数制数制之间的转换运算原码反码补码ASCII码BCD码数码之间的处理关系从不同的角度看待一个二进制数13预备知识22=424=1628=256210=1024220=10485761K=210=1024(Kilo)1M=1024K=220(Mega)1G=1024M=230(Giga)1个二进制位:bit(比特)8个二进制位:Byte(字节)1Byte=8bit2个字节:Word(字)1Word=2Byte=16bit141.2.1数制十进制:基数为10,逢十进一543.12=5×102+4×101+3×100+1×10-1+2×10-2二进制:基数为2,逢二进一1101112=1×25+1×24+1×22+1×21+1×20=5510十六进制:基数为16,逢十六进一1001,0001,1000,01119187=9×163+1×162+8×161+7×160八进制:基数为8,逢八进一15数制基数数码二进制Binary20,1八进制Octal80,1,2,3,4,5,6,7十进制Decimal100,1,2,3,4,5,6,7,8,9十六进制Hexadecimal160,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F16二进制十进制110111.11B=1×25+1×24+1×22+1×21+1×20+1×2-1+1×2-2=55.75D整数部分:除基取余法例:N=55D55/2=27余数=1(a0)27/2=13余数=1(a1)13/2=6余数=1(a2)6/2=3余数=0(a3)3/2=1余数=1(a4)1/2=0余数=1(a5)N=55D=110111B1.2.2数制之间的转换17例:N=55D0.425×2=0.85整数=00.85×2=1.70整数=10.70×2=1.40整数=10.40×2=0.80整数=00.80×2=1.60整数=1......N=0.425D=0.01101B小数部分:乘基取整法18二进制十六进制001101011011111135BF∴0011,0101,1011,1111B=35BFHA19C1010000110011100∴A19CH=1010,0001,1001,1100B19十六进制十进制BF3CH=11163+15162+3161+12160降幂法除法例:399D=?H39914315---25616118F∴399D=18FH20算术运算二进制加法规则乘法规则0+0=000=00+1=101=01+0=110=01+1=0(进位1)11=1十六进制05C3H3D25H+3D25H-05C3H42E8H3762H1.2.3运算(算术运算和逻辑运算)21逻辑运算(按位bit操作)“非”运算(NOT)AA0110“与”运算(AND)ABAB000010100111“异或”运算(XOR)ABAB000011101110“或”运算(OR)ABAB00001110111122例:X=00FFHY=5555H,求Z=XY=?X=0000000011111111BY=0101010101010101BZ=0101010110101010BZ=55AAH231.2.4原码反码补码数(机器数)的表示:计算机中的数用二进制表示,数的符号也用二进制表示。机器字长:指参与运算的数的基本位数,标志着计算精度,一般是字节的整数倍(8位、16位、32位等)。假设机器字长n为8位76543210符号位数值位假设机器字长n为16位符号位数值位1514131211109876543210符号位=0表示正数符号位=1表示负数24常用表示法——原码反码补码原码表示法:符号+绝对值例:n=8bit[+3]原码=0000,0011=03H[-3]原码=1000,0011=83H[+0]原码=0000,0000=00H[-0]原码=1000,0000=80H0的表示不唯一25反码表示法:正数的反码同原码,负数的反码数值位与原码相反例:n=8bit[+5]反码=0000,0101=05H[-5]反码=1111,1010=FAH[+0]反码=0000,0000=00H[-0]反码=1111,1111=FFH0的表示不唯一26补码表示法:IBM-PC采用补码表示法正数的补码:同原码[+1]补码=00000001=01H[+127]补码=01111111=7FH[+0]补码=00000000=00H负数的补码:(1)写出与该负数相对应的正数的补码(2)按位求反(3)末位加一例:机器字长8位,[-46]补码=?[46]补码=001011101101000111010010=D2H机器字长16位,[-46]补码=FFD2H按位求反末位加一27[-1]补码=11111111=FFH[-127]补码=10000001=81H[-0]补码=00000000=00Hn位补码的表数范围:-2n-1N2n-1-1n=8-128N127n=16-32768N3276728n位二进制补码的表数范围十进制二进制十六进制十进制十六进制n=8n=16+127011111117F+327677FFF+126011111107E+327667FFE......……...+20000001002+20002+10000000101+100010000000000000000-111111111FF-1FFFF-211111110FE-2FFFE......……...-1261000001082-327668002-1271000000181-327678001-1281000000080-32768800029补码的加法和减法求补运算:对一个二进制数按位求反、末位加一[X]补码[-X]补码[X]补码加法规则:[X+Y]补码=[X]补码+[Y]补码减法规则:[X-Y]补码=[X]补码+[-Y]补码补码减法可转换为补码加法符号位参加运算,能自动得到正确结果。无符号整数:表数范围0N2n-1n=80N255n=160N6553530补码的符号扩展在数据处理时,有时需要把8位二进制数扩展成16位二进制数,当要扩展的数是无符号数时,可在最高位前扩展8个0。如果要扩展的数是补码形式的有符号数,那么,就要进行符号位的扩展,符号扩展后,其结果仍是该数的补码。【例】符号扩展表示。21的8位二进制补码为:00010101符号扩展后21的16位二进制补码为:0000000000010101。00010101和0000000000010101都是21的补码。31ASCII码:用一个字节来表示一个字符,低7位为字符的ASCII值,最高位一般用作校验位。例:‘A’41H‘a’61H‘1’31H换行0AH回车0DH空格20H1.2.5字符的ASCII码32BCD码的表示:一位十进制的数用四位二进制数码来表示1.2.6BCD码例如:DBCD000001000120010:8100091001特点:每4位表示是二进制的数,4位与4位之间是十进制的数即用二进制的数码表示十进制的数。例如:16=00010110BCD=00010000B98=10011000BCD33BCD码在机内存放形式:非压缩形式压缩形式0000100000001001低高10011000BCD码的运算:•压缩的BCD码的加法校正34例:37+47=8437的BCD码为00110111B、47的BCD为01000111B第一步,先进行二进制加法00110111+0100011101111110第二步,对二进制数的相加结果进行校正由于运算结果01111110中的低4位大于9,故应在低四位加601111110+0000011010000100最终结果为84H,既是84D的BCD码,结果正确。35压缩的BCD码的减法校正例:84-47=3784的BCD码(压缩)为10000100B、47的BCD(压缩)为01000111B第一步,先进行二进制减法10000100-0100011100111101第二步,对二进制数的相减结果进行校正由于在运算中低4位向高4位借了1,故应在低四位减600111101-0000011000110111最终结果为37H,既是37D的BCD码,结果正确。36非压缩的BCD码的加法校正例1.3.337+47=84第一步,先进行二进制加法0000001100000111+00000100000001110000011100001110第二步,对二进制数的相加结果进行校正由于运算结果中的低字节的低4位大于9,故应加6,而有辅助进位位,直接将这一进位位加到高字节。0000011100001110+1110000010000000010037最终结果为84H,既是84D的BCD码,结果正确。非压缩的BCD码的减法校正例1.3.484-47=37第一步,先进行二进制减法0000100000000100-00000100000001110000001111111101第二步,对二进制数的相减结果进行校正由于在运算后,低字节的低4位大于9,所以应减6。0000001111111101-110000000111111011138然后将结果的低字节的高四位清0,结果为0307H,是37D的非