汇编语言程序设计课件第3讲汇编语言程序设计初步.ppt
第三讲 汇编语言程序设计初步,基本概念程序设计的步骤简单程序设计指令的不同执行序列的问题比较指令指令学习本讲小结,1、基本概念,程序=指令的有序序列计算机是通过执行程序来解决问题的计算机是通过执行指令序列来解决问题的指令是对计算机完成何种操作及对什么操作的命令,由操作码和操作数两部分组成操作码:指示计算机所要执行的操作操作数:指出指令执行操作的过程中所需要的操作数每种计算机都有一组指令集供用户使用指令系统寻址方式:获得操作数的方式,2、程序设计的步骤,分析问题 做什么?设计解决方法怎么做?画出流程图编写程序如何实现?运行调试让程序能够运行程序测试正确吗?设计总结,3、简单程序设计,简单?数据结构简单,数据量小寻址方式简单任务计算1+2+3+4的和一个简单的汇编语言程序不用乘法指令计算一个数x的14倍,3.1 第一个程序,计算1+2+3+4的和放入AH寄存器程序段:mov ah,1;ah=1 add ah,2;ah=ah+2 add ah,3;ah=ah+3 add ah,4;ah=ah+4 int 20h;程序结束参见教材mov 指令add 指令sub 指令,使用debug编写执行这个程序,运行debug程序开始运行进入汇编输入方式(A 命令)A 100 从内存偏移地址100H开始存放程序依次输入这个程序的每行最后一行直接回车察看程序(U 命令)U 100 10b 反汇编从100H到10BH的程序执行该程序(G 命令)g从IP开始执行程序察看寄存器(R 命令)R单步执行命令(T命令/P命令)TP,使用emu8086编写执行这个程序,打开emu8086新建空白程序输入该程序运行检查ah的内容单步运行观察ah的变化,3.2 一个简单的汇编语言程序,程序mov ax,0123hmov bx,0456hadd ax,bxadd ax,axint 20h在emu8086中执行该程序假设ax中存放的是x,bx中存放的是y该程序的结果是什么?,3.3 不用乘法指令计算一个数x(x在cl中)的14倍放入ah寄存器,方法1 14x=8x+4x+2xmov cl,3mov al,cladd al,al mov bl,aladd bl,blmov cl,bladd cl,clmov ah,0add ah,cladd ah,bladd ah,alint 20h,方法2 14x=16x-2xmov cl,3mov al,cladd al,al add al,aladd al,aladd al,aladd cl,clmov ah,alsub ah,clint 20h,4、指令的不同执行序列的问题,在C语言中有如下命令if(ab)x=a;else x=b;该命令做什么?条件语句!根据条件决定做什么操作汇编如何实现?任务将bx,cx中较大数放入ax计算1+2+3+100的和存入AX中将AX,BX和CX寄存器中最大数保存在DX中,4.1 将(bx,cx)中较大数放入ax,我们必须比较 bx 和 cxcmp指令cmp bx,cx转移指令jc 标号(小于转移)jmp 标号程序研究mov bx,100mov cx,50cmp bx,cx;比较bx和cxjc skip;bxcx 转移mov ax,bxjmp end;跳转skip:mov ax,cxend:int 20h;结束,4.2 用流程图表示思想,cmp bx,cx jc skip mov ax,bx jmp endskip:mov ax,cxend:int 20h,4.3 能不能简单些?,mov cx,-100 mov bx,-50 mov ax,bx cmp cx,ax jc end mov ax,cxend:int 20h,4.4 程序的问题:可以是带符号数吗?,mov cx,-100 mov bx,-50 mov ax,bx cmp cx,ax jc end mov ax,cxend:int 20h,4.5 计算1+2+3+100的和存入AX中,mov ax,0 mov cx,0loop:add ax,cx add cx,1 cmp cx,101 jc loop int 20h,AX=0CX=0,CX 101?,AX=AX+CXCX=CX+1,结束,4.6 简单程序也可能出错!,mov ax,0 mov cx,0loop:add cx,1 add ax,cxcmp cx,101 jc loop int 20h,AX=0CX=0,CX 101?,CX=CX+1 AX=AX+CX,结束,4.7 将AX,BX和CX寄存器中最大数保存在DX中,算法思路首先将AX和BX中大的放在DX中然后将CX和DX中大的放在DX中框图,在保证逻辑关系不变的情况下,框图可以变形,尽量将所有框放在一条直线上,YES向外,根据框图编写程序,CMP AX,BX JNC L1 MOV DX,BX JMP L2L1:MOV DX,AXL2:CMP CX,DX JC L3 MOV DX,CXL3:INT 20H,L1:,L2:,L3:,不同的思路得到不同的算法导致不同的程序,MOV DX,AX CMP AX,BX JNC L1 MOV DX,BXL1:CMP DX,CX JNC L2 MOV DX,CXL2:INT 20H,开始,结束,AXBX,AXDX,BXDX,DXCX,CXDX,N,Y,Y,N,L1:,L2:,5.比较指令小结,比较两个无符号数,并根据比较结果转移:格式:JB(JNAE,JC)OPR:格式:JNB(JAE,JNC)OPR:格式:JBE(JNA)OPR:格式:JNBE(JA)OPR,比较两个带符号数,并根据比较结果转移:格式:JL(JNGE)OPR:格式:JNL(JGE)OPR:格式:JLE(JNG)OPR:格式:JNLE(JG)OPR,比较的实质,程序1 mov dx,1 jc next mov dx,3next:int 20h程序 mov dx,1 jnc next mov dx,3next:int 20h执行结果有什么不同?如果在执行转移指令前修改CF位会如何?,比较指令的实质是根据标志寄存器中相应的标志位决定转移的。标志位=0还是=1是由什么决定的呢?很多指令的执行都会影响标志位察看 CMP,ADD等指令察看 MOV指令,6.指令学习,数据传送指令P47MOV传送P444 不影响标志MOV reg,dataMOV reg1,reg2XCHG交换P451 不影响标志XCHGreg1,reg2算术运算指令P58ADD加法指令P436 INC加1指令P441SUB减法指令P450DEC减1指令P439NEG求补指令P445CMP比较指令P438,思考,计算1+3+5+99的和计算3+6+9+12+99的和将AX,BX,CX中大小居中的数存放在DX中,7.本讲小结,什么是程序?程序是如何执行的?怎样将思想表示出来?程序怎样调试?怎样发现程序中的错误?数据量如果较多怎么办?,作业,1、编程若f(1)=1;f(2)=1;f(n)=f(n-1)+f(n-2)计算菲波纳契数列的第n项f(n)(n10)假设n存放在cl中,计算出的结果放在AX中2、编程将AX,BX,CX中大小居中的数存放在DX中要求流程图程序测试用例,