1、1教学内容第第1 1章章 基础知识基础知识第第2 2章章 寄存器寄存器第第3 3章章 寄存器寄存器(内存访问内存访问)第第4 4章章 第一个程序第一个程序第第5 5章章 BXBX和和looploop指令指令第第6 6章章 包含多个段的程序包含多个段的程序第第7 7章章 更灵活的定位内存地址的方法更灵活的定位内存地址的方法第第8 8章章 数据处理的两个基本问题数据处理的两个基本问题第第9 9章章 转移指令的原理转移指令的原理第第1010章章 CALLCALL和和RETRET指令指令第第1111章章 标志寄存器标志寄存器第第1212章章 内中断内中断第第1313章章 intint指令指令2第1章
2、基础知识1.1 1.1 机器语言机器语言 1.9 1.9 数据总线数据总线1.2 1.2 汇编语言的产生汇编语言的产生 1.10 1.10 控制总线控制总线1.3 1.3 汇编语言的组成汇编语言的组成 1.11 1.11 内存地址空间(概述)内存地址空间(概述)1.4 1.4 存储器存储器 1.12 1.12 主板主板1.5 1.5 指令和数据指令和数据 1.13 1.13 接口卡接口卡1.6 1.6 存储单元存储单元 1.14 1.14 各类存储器芯片各类存储器芯片1.7 CPU1.7 CPU对存储器的读写对存储器的读写 1.15 1.15 内存地址空间内存地址空间1.8 1.8 地址总线地
3、址总线l检测点检测点1.1l(1)1个个CPU的寻址能力为的寻址能力为8KB,那么它的地址总线的宽度为,那么它的地址总线的宽度为13位。位。l(2)1KB的存储器有的存储器有1024个存储单元,存储单元的编号从个存储单元,存储单元的编号从0到到1023。l(3)1KB的存储器可以存储的存储器可以存储8192(213)个个bit,1024个个Byte。l(4)1GB是是1073741824(230)个个Byte、1MB是是1048576(220)个个Byte、1KB是是1024(210)个个Byte。l(5)8080、8088、80296、80386的地址总线宽度分别为的地址总线宽度分别为16根
4、、根、20根、根、24根、根、32根,则它们的寻址能力分别为根,则它们的寻址能力分别为:64(KB)、)、1(MB)、)、16(MB)、)、4(GB)。)。l(6)8080、8088、8086、80286、80386的数据总线宽度分别为的数据总线宽度分别为8根、根、8根、根、16根、根、16根、根、32根。则它们一次可以传送的数据为根。则它们一次可以传送的数据为:1(B)、)、1(B)、)、2(B)、)、2(B)、)、4(B)。)。l(7)从内存中读取)从内存中读取1024字节的数据,字节的数据,8086至少要读至少要读512次,次,80386至少要读至少要读256次。次。l(8)在存储器中,
5、数据和程序以)在存储器中,数据和程序以二进制二进制形式存放形式存放。第2章 寄存器(CPU工作原理)2.1 2.1 通用寄存器通用寄存器2.2 2.2 字在寄存器中的存储字在寄存器中的存储2.3 2.3 几条汇编指令几条汇编指令2.4 2.4 物理地址物理地址2.5 162.5 16位结构的位结构的CPUCPU2.6 2.6 8086CPU8086CPU给给出出物物理理地地址址的方法的方法2.7 2.7“段地址段地址16+16+偏移地址偏移地址 =物理地址物理地址”的本质含义的本质含义2.8 2.8 段的概念段的概念2.9 2.9 段寄存器段寄存器2.10 CS2.10 CS和和IPIP2.1
6、2 2.12 代码段代码段l检测点检测点2.1l(1)写出每条汇编指令执行后相关寄存器中的值。lmovax,62627AX=F4A3Hlmovah,31HAX=31A3Hlmoval,23HAX=3123Hladdax,axAX=6246Hlmovbx,826CHBX=826CHlmovcx,axCX=6246Hlmovax,bxAX=826CHladdax,bxAX=04D8Hlmoval,bhAX=0482Hlmovah,blAX=6C82Hladdah,ahAX=D882Hladdal,6AX=D888Hladdal,alAX=D810Hlmovax,cxAX=6246Hl检测点检测点2
7、.1l(2)只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方。lmovax,2AX=2laddax,axAX=4laddax,axAX=8laddax,axAX=16l检测点检测点2.2l(2)有一数据存放在内存20000H单元中,现给定段地址为SA,若想用偏移地址寻到此单元。则SA应满足的条件是:最小为1001H,最大为2000H。l当段地址给定为1001H以下和2000H以上,CPU无论怎么变化偏移地址都无法寻到20000H单元。lll解题过程:l物理地址SA*16+EAl20000hSA*16+EAlSA=(20000h-EA)/16=2000h-EA/16lEA取最大值
8、时,SA=2000h-ffffh/16=1001h,SA为最小值lEA取最小值时,SA=2000h-0h/16=2000h,SA为最大值l检测点检测点2.2l(1)给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围为0010H到1000FH。ll解题过程:l物理地址SA*16+EAlEA的变化范围为0hffffhl物理地址范围为(SA*16+0h)(SA*16+ffffh)l现在SA=0001h,那么寻址范围为l(0001h*16+0h)(0001h*16+ffffh)l=0010h1000fh第3 章寄存器(内存访问)l3.1 3.1 内存中字的存储内存中字的存储 l3.2 D
9、S3.2 DS和和addressaddressl3.3 3.3 字的传送字的传送l3.4 mov3.4 mov、addadd、subsub指令指令l3.5 3.5 数据段数据段l3.6 3.6 栈栈l3.7 CPU3.7 CPU提供的栈机制提供的栈机制l3.8 3.8 栈顶超界的问题栈顶超界的问题l3.9 push3.9 push、poppop指令指令l3.10 3.10 栈段栈段l检测点检测点3.1l(1)在DEBUG中,用D0:0lf查看内存,结果如下:l0000:00007080F030EF6030E2-0080801266202260l0000:00106226E6D6CC2E3C3B
10、-ABBA000026066688l下面的程序执行前,AX=0,BX=0,写出每条汇编指令执行完后相关寄存器中的值lmovax,1lmovds,axlmovax,0000ax=2662Hlmovbx,0001bx=E626Hlmovax,bxax=E626Hlmovax,0000ax=2662Hlmovbx,0002bx=D6E6Hladdax,bxax=FD48Hladdax,0004ax=2C14Hlmovax,0ax=0lmoval,0002ax=00e6Hlmovbx,0bx=0lmovbl,000cbx=0026Hladdal,blax=000CHl检测点检测点3.1l(2)内存中的
11、情况如图3.6所示l各寄存器的初始值:cs=2000h,ip=0,ds=1000h,ax=0,bx=0;l写出CPU执行的指令序列(用汇编指令写出)。l写出CPU执行每条指令后,CS、IP和相关寄存器的数值。l再次体会:数据和程序有区别吗?如何确定内存中的信息哪些是数据,哪些是程序?l检测点检测点3.2l(1)补全下面的程序,使其可以将10000H-1000FH中的8个字,逆序拷贝到20000H-2000FH中。lmovax,1000Hlmovds,axlmovax,2000Hlmovss,axlmovsp,10hlpush0lpush2lpush4lpush6lpush8lpushAlpus
12、hClpushEl检测点检测点3.2l(2)补全下面的程序,使其可以将10000H-1000FH中的8个字,逆序拷贝到20000H-2000FH中。llmovax,2000Hlmovds,axlmovax,1000Hlmovss,axlmovsp,0lpopelpopclpopalpop8lpop6lpop4lpop2lpop0第第4 4章章 第一个程序第一个程序l4.1 4.1 一个源程序从写出到执行的过程一个源程序从写出到执行的过程l4.2 4.2 源程序源程序l4.3 4.3 编辑源程序编辑源程序l4.4 4.4 编译编译l4.5 4.5 连接连接l4.6 4.6 以简化的方式进行编译和
13、连接以简化的方式进行编译和连接l4.7 1.exe4.7 1.exe的执行的执行l4.8 4.8 可执行文件中的程序装入内存并运行的原可执行文件中的程序装入内存并运行的原理理l4.9 4.9 程序执行过程的跟踪程序执行过程的跟踪第五章第五章 BXBX和和looploop指令指令5.1 bx5.1 bx5.2 Loop5.2 Loop指令指令5.3 5.3 在在debugdebug中跟踪用中跟踪用looploop指令实现的循环程序指令实现的循环程序5.4 debug5.4 debug和汇编编译器和汇编编译器masmmasm对指令的不同处理对指令的不同处理5.5 loop5.5 loop和和bxb
14、x的联合应用的联合应用5.6 5.6 段前缀段前缀5.7 5.7 一段安全的空间一段安全的空间 5.8 5.8 段前缀的使用段前缀的使用第六章第六章 包含多个段的程序包含多个段的程序6.1 6.1 在代码段中使用数据在代码段中使用数据6.2 6.2 在代码段中使用栈在代码段中使用栈6.3 6.3 将数据、代码、栈放入不同的段将数据、代码、栈放入不同的段l检测点检测点6.1l(1)下面的程序实现依次用内存)下面的程序实现依次用内存0:00:15单元中的内容改写程单元中的内容改写程序中的数据,完成程序:序中的数据,完成程序:lassumecs:codesglcodesgsegmentldw0123
15、h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hlstart:movax,0lmovds,axlmovbx,0lmovcx,8ls:movax,bxlmovcs:bx,axladdbx,2lloopslmovax,4c00hlint21hlcodesgendslendstartl检测点检测点6.1l(2)下面的程序实现依次用内存)下面的程序实现依次用内存0:00:15单元中的内容改写程序中的数单元中的内容改写程序中的数据,数据的传送用栈来进行。栈空间设置在程序内。完成程序:据,数据的传送用栈来进行。栈空间设置在程序内。完成程序:lassumecs:code
16、sglcodesgsegmentldw0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hldw0,0,0,0,0,0,0,0,0,0lstart:movax,codesg;或或movax,cslmovss,axlmovsp,24h;或或movsp,36lmovax,0lmovds,axlmovbx,0lmovcx,8ls:pushbxlpopcs:bx;或或popss:bxladdbx,2lloopslmovax,4c00hlint21hlcodesgendslendstart第七章第七章 更灵活的定位内存地更灵活的定位内存地址的方法址的方法7.1
17、and7.1 and和和oror指令指令7.4 7.4 大小写转换的问题大小写转换的问题7.5 80867.5 8086的寻址方式的寻址方式第八章第八章 数据处理的两个基本数据处理的两个基本问题问题l8.1 bx8.1 bx、sisi、didi、bpbpl8.2 8.2 机器指令处理的数据所在位置机器指令处理的数据所在位置l8.3 8.3 汇编语言中数据位置的表达汇编语言中数据位置的表达l8.4 8.4 寻址方式寻址方式l8.5 8.5 指令要处理的数据有多长?指令要处理的数据有多长?l8.7 div 8.7 div 指令指令l8.8 8.8 伪指令伪指令 ddddl8.9 dup8.9 du
18、p第九章第九章 转移指令的原理转移指令的原理l9.1 9.1 操作符操作符offsetoffsetl9.2 jmp9.2 jmp指令指令l9.3 9.3 依据位移进行转移的依据位移进行转移的jmpjmp指令指令l9.4 9.4 转移的目的地址在指令中的转移的目的地址在指令中的jmpjmp指令指令l9.5 9.5 转移地址在寄存器中的转移地址在寄存器中的jmpjmp指令指令l9.6 9.6 转移地址在内存中的转移地址在内存中的jmpjmp指令指令l9.7 jcxz9.7 jcxz指令指令l9.8 loop9.8 loop指令指令l9.9 9.9 根据位移进行转移的意义根据位移进行转移的意义l9.
19、10 9.10 编译器对转移位移超界的检测编译器对转移位移超界的检测l检测点检测点9.1l(1)程序如下。)程序如下。lassumecs:codeldatasegmentldw2dup(0)ldataendslcodesegmentlstart:movax,datalmovds,axlmovbx,0ljmpwordptrbx+1lcodeendslendstartl若要使若要使jmp指令执行后,指令执行后,CS:IP指向程序的第一条指令,在指向程序的第一条指令,在data段中应段中应该定义哪些数据该定义哪些数据?ll答案答案db3dup(0)l答案答案dw2dup(0)l答案答案dd0l检测点
20、检测点9.1l(1)程序如下。)程序如下。lassumecs:codeldatasegmentldd12345678hldataendslcodesegmentlstart:movax,datalmovds,axlmovbx,0lmovbx,bx;或或movbx,wordptr0l;或或movbx,offsetstartlmovbx+2,cs;或或movbx+2,codeljmpdwordptrds:0lcodeendslendstartl补全程序,使用补全程序,使用jmp指令执行后,指令执行后,CS:IP指向程序的第一条指令。指向程序的第一条指令。l检测点检测点9.1l(3)用)用Debug
21、查看内存,结果如下:查看内存,结果如下:l2000:1000BE0006000000.l则此时,则此时,CPU执行指令:执行指令:lmovax,2000hlmoves,axljmpdwordptres:1000hl后,后,(cs)=0006H,(ip)=00BEHl检测点检测点9.2l补全编程,利用补全编程,利用jcxz指令,实现在内存指令,实现在内存2000H段中查找第一个值为段中查找第一个值为0的的字节,找到后,将它的偏移地址存储在字节,找到后,将它的偏移地址存储在dx中。中。lassumecs:codelcodesegmentlstart:movax,2000hlmovds,axlmov
22、bx,0ls:movch,0lmovcl,bxljcxzok;当当cx=0时,时,CS:IP指向指向OKlincbxljmpshortslok:movdx,bxlmovax,4c00hlint21hlcodeendslendstartl检测点检测点9.3l补全编程,利用补全编程,利用loop指令,实现在内存指令,实现在内存2000H段中查找第一个值为段中查找第一个值为0的的字节,找到后,将它的偏移地址存储在字节,找到后,将它的偏移地址存储在dx中。中。lassumecs:codelcodesegmentlstart:movax,2000hlmovds,axlmovbx,0ls:movcl,bx
23、lmovch,0linccxlincbxlloopslok:decbxlmovdx,bxlmovax,4c00hlint21hlcodeendslendstart第十章第十章 CALLCALL和和RETRET指令指令10.1ret和和retf10.2call指令指令10.3依据位移进行转移的依据位移进行转移的call指令指令10.4转移的目的地址在指令中的转移的目的地址在指令中的call指令指令10.5转移的目的地址在寄存器中的转移的目的地址在寄存器中的call指令指令10.6转移的目的地址在内存中的转移的目的地址在内存中的call指令指令10.7call和和ret的配合使用的配合使用10.8
24、mul指令指令10.9模块化程序设计模块化程序设计10.10参数和结果传递的问题参数和结果传递的问题10.11批量数据的传递批量数据的传递10.12寄存器冲突的问题寄存器冲突的问题l检测点检测点10.1l补全程序,实现从内存补全程序,实现从内存1000:0000处开始执行指令。处开始执行指令。lassumecs:codelstacksegmentldb16dup(0)lstackendslcodesegmentlstart:movax,stacklmovss,axlmovsp,16lmovax,1000hlpushaxlmovax,0lpushaxlretflcodeendslendstart
25、l检测点检测点10.2l下面的程序执行后,下面的程序执行后,ax中的数值为多少?中的数值为多少?l内存地址内存地址机器码机器码汇编指令汇编指令执行后情况执行后情况l1000:0b80000movax,0ax=0ip指向指向1000:3l1000:3e80100callspopipip指向指向1000:7l1000:640incaxl1000:758s:popaxax=6l检测点检测点10.3l下面的程序执行后,下面的程序执行后,ax中的数值为多少?中的数值为多少?l内存地址内存地址机器码机器码汇编指令汇编指令执行后情况执行后情况l1000:0b80000movax,0ax=0,ip指向指向10
26、00:3l1000:39a09000010callfarptrspopcs,popip,ip指指向向1000:9l1000:840incaxl1000:958s:popaxax=8hladdax,axax=10hlpopbxbx=1000hladdax,bxax=1010hl检测点检测点10.4l下面的程序执行后,下面的程序执行后,ax中的数值为多少?中的数值为多少?l内存地址内存地址机器码机器码汇编指令汇编指令执行后情况执行后情况l1000:0b80600movax,6ax=6,ip指向指向1000:3l1000:3ffd0callaxpopip,ip指向指向1000:6l1000:540i
27、ncaxl1000:658movbp,spbp=sp=fffehladdax,bplax=6+ds:(fffeh)=6+5=0bhl检测点检测点10.5l(1)下面的程序执行后,)下面的程序执行后,ax中的数值为多少?中的数值为多少?lassumecs:codelstacksegmentldw8dup(0)lstackendslcodesegmentlstart:movax,stacklmovss,axlmovsp,16lmovds,axlmovax,0lcallwordptrds:0ehlincaxlincaxlincaxlmovax,4c00hlint21hlcodeendslendsta
28、rtl检测点检测点10.5l(2)下面的程序执行后,)下面的程序执行后,ax和和bx中的数值为多少?中的数值为多少?lassumecs:codesglstacksegmentldw8dup(0)lstackendslcodesgsegmentlstart:lmovax,stacklmovss,axlmovsp,10hlmovwordptrss:0,offsets;(ss:0)=1ahlmovss:2,cs;(ss:2)=cslcalldwordptrss:0;cs入栈入栈,ip=19h入栈入栈,转到转到cs:1ah处执行指令处执行指令l;(ss:e)=cs,(ss:c)=iplnopls:mo
29、vax,offsets;ax=1ahlsubax,ss:0ch;ax=1ah-(ss:0ch)=1ah-19h=1lmovbx,cs;bx=cs0c5bhlsubbx,ss:0eh;bx=cs-cs=0lmovax,4c00hlint21hlcodesgendslendstart第十一章第十一章 标志寄存器标志寄存器l11.1 ZF11.1 ZF标志标志l11.2 PF11.2 PF标志标志l11.3 SF11.3 SF标志标志l11.4 CF11.4 CF标志标志l11.5 OF11.5 OF标志标志l11.6 adc11.6 adc指令指令l11.7 sbb11.7 sbb指令指令l11.
30、8 cmp11.8 cmp指令指令l11.9 11.9 检测比较结果的条件转移指令检测比较结果的条件转移指令l11.10 DF11.10 DF标志和串传送指令标志和串传送指令l11.11 pushf11.11 pushf和和popfpopfl11.12 11.12 标志寄存器在标志寄存器在DebugDebug中的表示中的表示l检测点检测点11.1l写出下面每条指令执行后,写出下面每条指令执行后,ZF、PF、SF、等标志位的值。、等标志位的值。lsubal,alal=0hZF=1PF=1SF=0lmoval,1al=1hZF=1PF=1SF=0lpushaxax=1hZF=1PF=1SF=0lp
31、opbxbx=1hZF=1PF=1SF=0laddal,blal=2hZF=0PF=0SF=0laddal,10al=12hZF=0PF=1SF=0lmulalax=144hZF=0PF=1SF=0l检测点检测点11.2l写出下面每条指令执行后,写出下面每条指令执行后,ZF、PF、SF、CF、OF等标等标志位的值。志位的值。lalCFOFSFZFPFlsubal,al0h/00000000b00011lmoval,10h10h/00010000b00011laddal,90ha0h/10100000b00101lmoval,80h80h/10000000b00101laddal,80h0h/0
32、0000000b11011lmoval,0fch0fch/11111100b11011laddal,05h1h/00000001b10000lmoval,7dh7dh/11111101b10000laddal,0bh88h/10001000b01101l检测点检测点11.3l(1)补全下面的程序,统计补全下面的程序,统计F000:0处处32个字节中,大小在个字节中,大小在32,128的数据个数。的数据个数。lmovax,0f000hlmovds,axlmovbx,0;ds:bx指向第一个字节指向第一个字节lmovdx,0;初始化累加器初始化累加器lmovcx,32ls:moval,bxlcmp
33、al,32;和和32进行比较进行比较ljbs0;如果低于如果低于al转到转到s0,继续循环继续循环lcmpal,128;和和128进行比较进行比较ljas0;如果高于如果高于al转到转到s0,继续循环继续循环lincdxls0:incbxlloopsl检测点检测点11.3l(2)补全下面的程序,统计补全下面的程序,统计F000:0处处32个字节中,大小在个字节中,大小在(32,128)的数据个数。的数据个数。lmovax,0f000hlmovds,axlmovbx,0;ds:bx指向第一个字节指向第一个字节lmovdx,0;初始化累加器初始化累加器lmovcx,32ls:moval,bxlcm
34、pal,32;和和32进行比较进行比较ljnas0;如果不高于如果不高于al转到转到s0,继续循环继续循环lcmpal,128;和和128进行比较进行比较ljnbs0;如果不低于如果不低于al转到转到s0,继续循环继续循环lincdxls0:incbxlloopsl检测点检测点11.4l下面指令执行后,下面指令执行后,(ax)=45hlmovax,0lpushaxlpopflmovax,0fff0hladdax,0010hlpushflpopaxlandal,11000101Blandah,00001000B0000ofdfiftfsfzf0af0pf0cf000000*010*0101ax=flag=000000*010*0101最后两行将最后两行将*位清位清0al=01000101=45hah=00000000=0