版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第四章 汇编语言程序设计§4.1 汇编语言语法一、程序格式 ;( 程序结束,给出启动地址。L CS:IP )即:程序由段组成,段由语句组成。 (各段有名)二、语句构成1、语句种类指令语句 (有机器码):(如:传送、运算、控制)标号:操作码 操作数 ;注释 (用途:完成实际操作)伪指令语句 (无机器码): (如:排段落、定类型、置初值等)名字: 命令 参数 ;注释(用途:做好准备工作)人工:吃力、易错2、名称(符号)标识符:如 A3、XY 等。 (31个字符,不可数起头)保留字:如 MOV、BX等。 (不可另作他用)变量:存储器数,如 V1、XA等。(属性:段值、偏移、类型1,2,4,
2、)标号:指令地址,如 L1、N等。(属性:段值、偏移、类型near, far)-1,-23、运算符及表达式 (*仅在汇编时用) 表达式:由“操作数”和“运算符”组成。 (汇编时得一值)如:MOV BX,OFFSET X2 ;BXOFFSET X2MOV SI, OFFSET $ ;SIOFFSET $ ($:当前位置)X1 EQU THIS WORD;X1指定为字型变量,自此处开始L3 LABEL FAR;L3指定为远标号,自此处开始MUL BYTE PTR BX ;AL×BXAX,设定指定字节类型LEA SI,BUF+24;SIOFFSET BUF + 24三、指令语句见“指令系统
3、”。 (*注意:操作数的类型必须明确,否则无法汇编。)*另外,返回DOS的方法: 、PUSH DS ;DS堆栈 MOV AX,0;PUSH AX;0 堆栈 ;RET ;堆栈 DS:0000 ( CS:IP ) ( COM.COMMAND 安装内容:DS:0000 INT 20H , f.exe ) 、MOV AH,4CH; INT 21H;( 两者的区别:INT 20H 返回DOS; 而INT 21H 返回调用者 )四、伪指令语句1、常数定义名字 EQU 表达式 ;( 要改先撤 )名字 表达式 ;( 随时可改 )PURGE 名字1,名字2, ;( 撤消定义 )如:n1 EQU 36H ;n13
4、6HC1 n1 + 4;C136H+43AH2、变量定义 ( 变量属性:段值、偏移、类型1,2,4, )名字 DB 表达式 ;( 定义字节型变量 )名字 DW 表达式 ;( 定义字型变量 )名字 DD 表达式 ;( 定义双字型变量 ) 名字 LABEL 类型 ;( 定义变量或标号,自此处开始 )表达式中:“?”表示 初值不定,“n DUP”表示重复n次)* 注意:伪指令中出现变量名,均取其属性。(因为真正的CPU指令尚未运行,不可能取内容。)如:DAT1 SEGMENT;假定段地址为2010HSUM DB ?,? ,? ,?;0000H:?, ?, ?, ?V1 DW 1234H, 68H,1
5、4;0004H:34H, 12H, 68H, 00H, 0EH, 00HV2 DW 2 DUP (0, 1);000AH:00H,00H,01H,00H,00H,00H,01H,00HXB LABEL BYTE ; XB定义为字节型变量,自此处0012H开始。X1 DW V1;0012H:04H,00H (取V1的偏移地址:0004H)N1 EQU $V1 ; N1$V10014H0004H10HX2 DD V2 ;0014H:0AH,00H,10H,20H ;(即X2取V2的地址2010H:000AH,双字长)DAT1 ENDS3、段的定义段名 SEGMENT 定位类型 组合类型 类别名 ;
6、段名 ENDS ;* 定位类型:设定段的起始边界。(*段内偏移地址不一定从0开始。)4种类型:Page(页),XXX00H; Para(节),XXXX0H,为默认类型。Word(字),偶数地址;Byte(字节),任意地址。组合类型:表示段与段的连接方式。几种:None, 相互无关联,按自然顺序。Public,共一段址,相继连接Stack,共段邻接, 自动初始化SS和SP。Common, 共段覆盖Memory, 定位在最高地址,且共段覆盖(即共享)。At nn(或表达式),即段地址nn 。类别名:link连接时,把类别名相同的段放在连续存储区,但若无Public、Common或Memory参数,
7、 各段仍是独立段。LINK连接时,先处理组合类型,再处理定位类型,最后处理类别名。( 各类型参数可有可无,但顺序不可改变。)段寄存器设定:(指定当前段寄存器为哪个段寻址,以便汇编)ASSUME CS:S1,SS:S2,DS:S3,ES:S4* 取消设定:ASSUME NOTHING语句定位:ORG 表达式 ;该指令后的代码从“表达式”给定地址开始如:ORG $ + 20H ;从当前地址20H开始4、过程定义 (也称子程序,供调用)名字 PROC (Near) / Far ;RET;(根据PROC的类型,自动译为RET或RETF)名字 ENDP;* 5、宏指令的定义 (供调用) 宏指令:即一组指
8、令的缩写。注意:先定义(符号参量:加&)、后调用(调用即展开,可以嵌套。)(*比较:子程序:内存省、速度慢。宏指令:书写简、速度快。) (1)、一般宏名字 MACRO参量 ;定义宏(LOCAL标号);ENDM ;宏结束例如:移位宏指令SHFXMACROOP,S,N;定义MOVCL,N;S&OP S,CL;ENDM;结束SHFXHL,AX,4;调用:AX逻辑左移4次SHFXAR,BX,9;调用:BX算术右移4次查表宏指令FTabMACROV,N;定义LEASI,V;MOVAX,N;ADD SI,AX;MOVAX,SI;ENDM;结束FTabY,6;调用:Y+6AX(2)、重复宏R
9、EPT次数 ;设置重复次数; ENDM ;宏结束例如:在内存中定义10个数:2,4,6,20X0;REPT10;宏定义XX+2;DBX;ENDM;宏结束§4.2 程序设计方法步骤:确定算法、画出流程、编写程序、调试运行一、顺序程序 (最简单的程序)语句按顺序执行,无转移无循环等。(最简单)例4.1:计算Y2(A+B)C,程序如下。数据段:DATASEGMENT;定义数据段“DATA”ADB25;定义A,初值=25BDB43;定义B,初值=43CDB76;定义C,初值=76YDB?;定义Y,初值=?(即初值不确定)DATAENDS;数据段“DATA”结束堆栈段:STACKSEGMENT
10、 PARA STACK;定义堆栈段“STACK”DW100H DUP (0);设置堆栈空间STACKENDS;堆栈段“STACK”结束代码段:CODESEGMENT; 定义代码段“CODE”ASSUME CS:CODE,SS:STACK,DS:DATA;指定当前所用段START:MOVAX,DATA; MOVDS,AX;设置数据段值MOVAL,A;取值ADDAL,B;运算ADDAL,AL;SUBAL,C;MOVY,AL;存结果MOVAH,4CH;INT21H;返回DOSCODEENDS;代码段“CODE”结束ENDSTART;整个程序结尾(给出运行起始地址)例4.2:查表求YsinX,假定:3
11、0°X90°。程序:DATA1SEGMENT;XDB36;定义X,初值36度TabDWy30,y90;定义sinX表 (初值已定)YDW?;定义YDATA1ENDS;STACK1SEGMENTSTACK;DW100H DUP (0);设置堆栈空间STACK1ENDS;CODE1SEGMENT;ASSUME CS:CODE1,SS:STACK1,DS:DATA1;指定所用段START:MOVAX,DATA1;MOVDS,AX;设置数据段值LEABX, Tab;取表头MOVAL,X;取XSUBAL,30;算差值: X30ADDAL,AL;求偏移量:2·(X30)MOV
12、AH,0;ADDBX,AX;求地址:EATab2(X30)MOVAX,BX;取表值MOVY,AX;存结果MOVAH,4CH;INT21H;返回DOSCODE1ENDS;ENDSTART;程序结尾二、分支程序 (解决路径选择的问题)分支两要素:判断 (根据运算结果的状态标志),转移 (主要由条件转移指令实现)可用比较、转移或跳转表等实现分支。(*注意:每支都要完整)-4. 8 -分支结构流程图1、单重分支 (一次判断转移)例4.3:求Y |X|DATA1SEGMENT;XDW9036H;定义XYDW?;定义YDATA1ENDS;STACK1SEGMENT;DW100H DUP(0);设置堆栈空间
13、(即堆栈大小)TOPLABELWORD;定义标号TOP(字型)STACK1ENDS;CODE1SEGMENT;ASSUME CS:CODE1,SS:STACK1,DS:DATA1;指定所用段START:MOVAX,DATA1;MOVDS,AX;设置DS段值MOVAX,STACK1;MOVSS,AX; 设置SS段值MOVSP,OFFSET TOP;设置SP初值(栈底)MOVAX,X; 取值ANDAX,AX; 运算置FRJNSDONE; 判断转移NEGAX;求负DONE:MOVY,AX;存放结果MOVAH,4CH;INT21H;返回DOSCODE1ENDS;ENDSTART;程序结尾例4.3主要流
14、程图2、多重分支 (多次判断转移)例4.4:16进制数符 ASCII分析:09 30H39H,差值30H;(数符30H即得ASCII)AF 41H46H,差值37H;(数符37H即得ASCII)方法:判别加差;(09 + 30H;AF + 37H)DATA1SEGMENT;NDB05;定义NASCDB?;定义ASC(存放结果ASCII)DATA1ENDS;STACK1SEGMENTSTACK;DW200H DUP (?);设置堆栈空间STACK1ENDS;CODE1SEGMENT;ASSUME CS:CODE1,SS:STACK1,DS:DATA1;指定所用段START:MOVAX,DATA1
15、;MOVDS,AX;设置DS段值MOVAL,N; 取值CMPAL,09; 比较,置FRJBEL1; 判断转移,9?CMPAL,15;比较,置FRJAL2;判断转移,15?ADDAL,07H;加差07HL1:ADDAL,30H;加差30HJMPSHORT L3;转至L3L2:MOVAL,0FFH;N非16进制数符,存标记0FFHL3:MOVASC,AL;存放结果MOVAH,4CH;INT21H; 返回DOSCODE1ENDS;ENDSTART;程序结尾例4.4主要流程图3、查表转移 (利用跳转表实现分支)例4.5:利用编号N07转入相应的处理程序S0S7,各程序的入口地址为SA0SA7(均为16
16、位)。分析:将“转移地址”建一表格,通过查表转入相应程序。DATA1SEGMENT;NDB3;定义NTabDWSA0, , SA7 ;定义“转移地址”表 (实际地址)DATA1ENDS;STACK1SEGMENTSTACK;DW100H DUP (0);设置堆栈空间STACK1ENDS;CODE1SEGMENT;ASSUME CS:CODE1,SS:STACK1,DS:DATA1;指定所用段START:MOVAX,DATA1;MOVDS,AX;设置段值MOVAL,N;取N值CMPAL,07;JAOther;N7,转到otherADDAL,AL;求距离:2NCBW;LEABX, Tab;取表头A
17、DDBX,AX;求地址:EATab+2N ( 即:T0+nW )JMPWORD PTR BX;转到相应的处理程序 (S0S7之一)Other:MOVAH,4CH;INT21H;返回DOSCODE1ENDS;ENDSTART;程序结尾习题五教材P151(4.10习题): 一、1,2,3,4,5,6,7,8,9 上机补充及上机安排三、循环程序(解决多次重复操作的问题)循环的组成:初值部分、循环部分、结束控制-4. 9 -两种结构: -4. 10 -、先操作、后判断(至少1次) 、先判断、后操作(可以0次)循环分类:单重循环(内无循环)、多重循环(内有循环)计数循环(次数已知)、条件循环(次数未知)
18、-4. 10 -1、单重循环 例4.6:求数组X中负数的个数。 (先操作、后判断)DATA1SEGMENTNDW300,?;定义个数及结果XDBX1, , X300 ;定义数组XDATA1ENDSSTACK1SEGMENTSTACK;DW100H DUP (0);STACK1ENDS;CODE1SEGMENTASSUME CS:CODE1,SS:STACK1,DS:DATA1;START:MOVAX,DATA1;MOVDS,AX;设置段值LEASI,N;SI指向NLEADI,X;DI指向XMOVCX,SI;置CX=N,作为循环次数MOVBX,0;计数器BX清0L1:MOVAL,DI;取数ORA
19、L,AL;置标志JNSL2;非负:转L2INCBX;负:计数器BX加1L2:INCDI;调整指针DILOOPL1;循环次数控制MOVSI+2,BX;存结果HLT;结束CODE1ENDS;ENDSTART;程序结尾例4.7:数组求和:Y Xi 。 (假设X为字节型数,Y可用字型数表示。)DATA1SEGMENTXDBX1, , Xn ;定义数组XNEQU$X;定义数组个数NYDW?;定义YDATA1ENDSSTACK1SEGMENTSTACK;DW100H DUP (0);STACK1ENDS;CODE1SEGMENT;ASSUME CS:CODE1,SS:STACK1,DS:DATA1;STA
20、RT:MOVAX,DATA1;MOVDS,AX;设置段值MOVCX,N;置循环次数(即数组个数)MOVBX,offset X;BX指向XMOVAX,0;累加器AX清0L1:ADDAL,BX;加1个数ADCAH,0;加CFINCBX;调整指针BXLOOPL1;循环次数控制MOVY,AX;存结果HLT;结束CODE1ENDS;ENDSTART;程序结尾2、多重循环及条件循环例4.8:延时程序。(二重循环。*注意:内外不可交叉。)假设延时100ms,即:t10×(2801×)100ms DLYPROC ;定义过程DLY,延时子程序MOVBL,10;外层循环次数初值L1:MOVCX
21、,2801;内层循环次数初值L2:LOOPL2;内层循环次数控制DECBL;JNZL1;外层循环次数控制RET;返回DLYENDP ;过程DLY结束例4.9:求AX中1的个数,存入CX。 (先判断、后操作)MOVCX,0;计数器CX清0L1:ANDAX,AX;置标志JZdone;AX0,转done(循环结束控制)SHRAX,1;移出1位CFJNCL1;CF0,转L1INCCX;CF=1,计数器CX加1JMPL1;继续循环done:HLT;结束四、子程序 (供调用的独立程序段,又称“过程”。)说明文件:、名称、功能。、入口参数、出口参数。、所用寄存器、存储器。、用到的其他子程序等。过程定义:名字
22、 PROC (Near) / Far ;过程体RET名字 ENDP参数传递:寄存器传递(r),适于参数较少的情况。存储器传递(m),适于参数较多的情况。堆栈传递(stack),适于嵌套、递归或参数较多的情况。现场保护:现场:程序中所用到的某些r和m的当前值。保护:可在主程序、也可在子程序。可压入堆栈,或存入其它r或m中。(子程序中通常是压入堆栈。)调用返回:CALL A; (CS)、IP 栈,A (CS)、IP 其中A 包括:L、r、m 。 ( L分两种:near, far ; r、m同前 )RET i ; 栈 (CS)、IP, SP SP i RET ; 栈 (CS)、IP 嵌套递归:嵌套:
23、子程序中再调用子程序。(* 借助于堆栈:逐层调用,逐层返回。)递归:子程序中再调用子程序自身。子程序嵌套或递归示意图例4.10:多字节加法子程序。入口参数:SI加数首地址,DI被加数首地址,CX字节数。出口参数:BX和的首地址。MADDPROCFAR;定义子程序MADDPUSHBX;保护现场CLC;CF清0L1:MOVAL,SI;取加数ADCAL,DI;加被加数MOVBX,AL;存和INCSI;调整指针INCDI; ”INCBX; ”LOOPL1;循环次数控制POPBX;恢复现场RET;子程序返回MADDENDP ;子程序MADD结束*附:调用实例一个。STACK1SEGMENT PARA S
24、TACK;DW 100H DUP (0);定义堆栈STACK1ENDS;DATA1SEGMENT;X1DB 8 DUP(?);定义加数X1X2DB 8 DUP(?);定义被加数X2YDB 8 DUP(?);定义和YNEQU8;字节数DATA1ENDS;MAINSEGMENTASSUME CS:MAIN,SS:STACK1,DS:DATA1;START:MOVAX,DATA1;MOVDS,AX;设置段值LEASI,X1;置参数1(加数首址)LEADI,X2;置参数2(被加数首址)MOVCX,N;置参数3(字节数)LEABX,Y;置参数4(和数首址)CALLMADD;调用(求和)HLT;结束MAI
25、NENDS;PROCSSEGMENTASSUME CS:PROCS,SS:STACK1,DS:DATA1;MADDPROCFAR;定义子程序MADD;(同上)RET;子程序返回MADDENDP ;子程序MADD结束PROCSENDS;ENDSTART;程序结尾* 例4.11:利用“堆栈传参”子程序,求数组X1及X2各自之和。STACK1SEGMENTSTACK;DW100H DUP (0);定义堆栈STACK1ENDS;DATA1SEGMENTX1DB100 DUP(?);定义数组X1sum1DW?;定义和sum1X2DB100 DUP(?);定义数组X2sum1DW?;定义和sum2DATA
26、1ENDSMAINSEGMENTASSUME CS:MAIN,SS:STACK1,DS:DATA1;START:MOVAX,DATA1;MOVDS,AX;设置段值LEABX,X1;PUSHBX;参数1(首址)进栈MOVCX,size X1;PUSHCX;参数2(个数)进栈CALLSUM;调用(求和)LEABX,X2;PUSHBX;参数1进栈MOVCX,size X2;PUSHCX;参数2进栈CALLSUM;调用(求和)HLT;结束MAINENDS;PROCSSEGMENTASSUME CS:PROCS,SS:STACK1,DS:DATA1; SUMPROCFARPUSH BP;保护现场MOV
27、BP,SP; ” (用BP记下当前SP位置,以便取参数。)-4. 15 -PUSH AX ; ”PUSH BX; ”PUSH CX; ”PUSHF ; ”MOV BX,BP+08;取参数1(首址),利用指针BP(不变)MOV CX,BP+06;取参数2(个数)MOV AX,0;累加器AX清0L1: ADD AL,BX ;累加ADC AH,0;加CFINC BX;调整指针BXLOOP L1;循环次数控制MOV BX,AX ;存和POPF ;恢复现场POP CX; ”POP BX ; ”POP AX ; ”POP BP; ”RET 4 ;返回,且SP+4调整(恢复到存参前的原位)SUM ENDP;
28、PROCSENDS;ENDSTART;程序结尾调用前后SP变化情况*注意:SP变化情况 (调用之后,SP必须恢复原位!)*例题:利用递归子程序求:YN! (略)习题六教材P153(4.10习题): 二、1,2,3;三、1,2,3五、系统功能调用 (利用系统资源)利用BIOS和DOS功能程序,简化设计。(包括:输入/输出、文件管理等。) 调用格式:INT n ; (还需设置:入口参量、功能号。)(1)、BIOS功能调用 (略)(2)、DOS功能调用 如:01,键入字符:( 键入值 AL )MOVAH,01H;INT21H;02,显示字符:( * 显示 )MOVDL,* ;MOVAH,02H;IN
29、T21H;尾09,显示字串:(所在存储区 DS:DX:X1Xn, $ )MOVDX,2300H;(字串首地址)MOVAH,09H;INT21H;0A,键入字串:(键入存放区DS:DX:n, ?, n DUP (?) )设定长,实际长,可存放:n1个 CRMOVDX,3600H;(存放首地址)MOVAH,0AH;INT21H;例4.12:键入字符串并再次在屏幕上输出显示。STACK1SEGMENT PARA STACK;DW 100H DUP (0);STACK1ENDS;DATA1SEGMENT; (换行, 回车, 串尾)X1DB Input ? Y/N:, 0AH, 0DH, $ ;定义字串
30、X1X2DB Please input:, 0AH, 0DH, $ ;定义字串X2X3DB 80, ?, 80 DUP(?);定义键入串DATA1ENDS;MAINSEGMENT;ASSUME CS:MAIN,SS:STACK1,DS:DATA1;begin:MOVAX,DATA1;MOVDS,AX;设置段值L1:LEADX,X1;显示字串X1MOVAH,09H;INT21H;MOVAH,01H;INT21H;键入ALCMPAL, Y ;键入Y?JNEL2;LEADX,X2;显示字串X2MOVAH,09H;INT21H;LEADX,X3;输入字串X3MOVAH,0AH;INT21H;LEASI
31、,X3;以下X3加尾$ MOVAL,SI+01;CBW;ADDSI,AX;MOVbyte PTR SI+02, $ LEADX,X3+02;显示字串X3MOVAH,09H;INT21H;JMPL1;继续循环L2:MOVAH,4CH;返回DOSINT21H;MAINENDS;ENDbegin;程序结尾六、程序编写及分析 (程序段块语句)基本结构:顺序、分支、循环、子程序、*DOS调用模块组成:初值部分、主体部分、后续部分 * 分支主体:置F、判别(运算开始),分支处理(标号结束)* 循环主体:重复操作(标号开始),循环控制(LOOP或JP结束)1、编程序例4.13:将ASCII码表示的两位十进制
32、数转换成一字节二进制数。* 方法:ASCII(30H)Decimal(D1×10D0)BinaryDATASEGMENT;ASDECDB37H, 39H;定义ASDECBIN DB?;定义BINDATAENDS;CODESEGMENT;ASSUME CS:CODE,DS:DATA;START:MOV AX,DATA;MOV DS,AX;MOVSI, offset ASDEC;MOVAL, SI;SUBAL, 30H;D1:ASCDecSALAL, 1;AL×2MOVBL, AL;MOVCL, 2;SALAL, CL;ADDBL, AL;D1×10INCSI;MOV
33、AL, SI;SUBAL, 30H;D0:ASCDecADDAL, BL;D0(D1×10)MOVBIN, AL;MOVAH, 4CH;INT21H;返回DOSCODEENDS;ENDSTART;例4.14:将ASCII码表示的两位16进制数转换成一字节二进制数。* 方法:ASCII(09:30H,AF:37H)Hexdecimal(移位)BinaryDATASEGMENT;ASHEXDB41H, 36H;BIN DB?;DATAENDS;CODESEGMENT;ASSUME CS:CODE,DS:DATA;START:MOV AX,DATA;MOV DS,AX;MOVSI, off
34、set ASHEX;MOVAL, SI;取第1位SUBAL, 30H;ASCHex(09)1CMPAL,0AH;JBNEXT1;SUBAL,7;ASCHex(AF)1NEXT1:MOVCL,4;SALAL,CL;左移4位MOVBL,AL;INCSI;MOVAL,SI;取第2位SUBAL,30H;ASCHex(09)0CMPAL,0AH;JBNEXT2;SUBAL,7;ASCHex(AF)0NEXT2:ORAL,BL; (两部分)组合BinMOVBIN, AL;存放结果MOVAH, 4CH;INT21H;CODEENDS;ENDSTART;例4.15:将一字节二进制数转换成两位ASCII码表示的
35、十进制数。* 方法:Binary(减10次数D1,差D0)Decimal(Di+30H)ASCIIDATASEGMENT;BINDB01001111B;ASDECDB2 DUP (?);DATAENDS;CODESEGMENT;ASSUMECS:CODE,DS:DATA;START:MOVAX,DATA;MOVDS,AX;MOV DI, offset ASDEC;DI指向ASDECXOR AX, AX;AX清0MOV AL, BIN;取BINAGAIN:SUBAL, 10;减10JBNEXT;INCAH;计数:减10次数D1JMPAGAIN;NEXT:ADDAL, 10; (恢复最后多减的一次
36、)ADDAH, 30H;30H ASCIIMOVDI, AH;INCDI;ADDAL, 30H;差D0,30HASCIIMOVDI, AL;MOVAH, 4CH;INT21H;CODEENDS;ENDSTART;例4.16:将ASCII码表示的5位十进制数(65535)转成2字节二进制数。* 方法:ASCII(30H)Decimal(循环:aa×10+Di)Binary,即重复:“乘10加次位”亦即:d4d3d2d1d0 (0×10+d4)×10+d3)×10+d2)×10+d1)×10+d0 DATASEGMENT;ASDECDB
37、33H, 39H, 36H, 32H, 35H;定义ASDECCOUNT EQU $ - ASDEC;定义次数COUNTBINDW ?;定义BINDATAENDS;CODE SEGMENT;ASSUME CS:CODE, DS:DATA;START:MOV AX, DATA;MOV DS, AX;MOV SI, offset ASDEC;SI指向ASDECMOV CX, COUNT;置循环次数CXXOR AX, AX;AX清0AGAIN:ADD AX, AX;AX×2MOV BX, AX;ADD AX, AX;ADD AX, AX;ADD AX, BX;AX×10MOV B
38、H, 0;MOV BL, SI;取1位SUB BL, 30H;减30H DecADD AX, BX;AXdiINC SI;SI+1调整LOOP AGAIN;循环次数控制MOV BIN, AX;存结果MOV AH, 4CH;INT 21H;CODE ENDS;END START;2、读程序 (分析程序给出其功能或执行结果)例4.17:分析给出以下程序的功能或执行结果。DATASEGMENT;BINDW 3A84H;ASDECDB 5 DUP(?);PWTABDW 104,103,102,101,1;DATAENDS;CODE SEGMENT;ASSUME CS:CODE, DS:DATA;STA
39、RT:MOV AX,DATA; MOV DS,AX;LEA DI,ASDEC;DI指向ASDECLEA SI,PWTAB;SI指向PWTABMOV AX,BIN;取值:AXBINLOP1:XORCL,CL;CL清0MOVBX,SI;取权:BX10iLOP2:SUBAX,BX;逐次减权 JBNEXT;直至不够减 DiINCCL;CL+1计数JMPLOP2;NEXT:ADDAX,BX;恢复末次减掉的数ADDCL,30H;Di ASCMOVDI,CL;存放Di的ASCINCSI;指向下一位INCSI;INCDI;CMPBX,1;直到个位为止JNZLOP1;MOV AH, 4CH;返回DOSINT 2
40、1H;CODE ENDS;END START;功能(结果): 将两字节2进制数转换成5位10进制数的ASCII并存放。例4.18:给出程序的功能或执行结果。DATASEGMENTBCD1DB39H, 26H, 51H, 78H;BCD2DB47H, 52H, 60H, 15H;SUMDB4DUP (?);DATAENDS;CODE SEGMENT;ASSUME CS:CODE, DS:DATA;START:MOV AX,DATA;MOV DS,AX;LEA SI,BCD1 ;SI指向BCD1LEA BX,BCD2;BX指向BCD2LEA DI,SUM ;DI指向SUMMOV CL,4 ;CL=
41、4CLC ;CF清0AGAIN:MOV AL,SI ;取BCD1ADC AL,BX ;加BCD2DAA ;BCD调整MOV DI,AL ;存和INC SI ;指向下一位INC BX;INC DI;DEC CL;计数JNZ AGAIN ;逐字节相加(直到CL个加完)MOV AH, 4CH;INT 21H;CODE ENDS;END START;功能(结果): SUM:86H,78H,11H,94H 例4.19:给出程序的功能或执行结果。DATASEGMENT;DAT1DB29H;DAT2DB?;DAT3DB?;DATAENDS;CODE SEGMENT;ASSUME CS:CODE, DS:DATA
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年驻马店幼儿师范高等专科学校单招职业适应性考试题库及答案详解(基础+提升)
- 2026年阳泉师范高等专科学校单招职业适应性测试题库附参考答案详解ab卷
- 2026年长沙环境保护职业技术学院单招职业倾向性测试题库附答案详解(夺分金卷)
- 2025年乐东黎族自治县农村、社区干部后备力量招募备考题库及答案详解1套
- 2025年砂子塘街道社区卫生服务中心公开招聘备考题库及一套答案详解
- 2026年黑龙江三江美术职业学院单招职业适应性考试题库含答案详解(黄金题型)
- 2026年陕西省商洛地区单招职业适应性测试题库带答案详解(a卷)
- 2025年新疆医科大学第四附属医院(新疆维吾尔自治区中医医院)面向社会公开招聘事业单位工作人员110人备考题库及参考答案详解1套
- 广西大学附属中学面向2026届高校毕业生招聘教师8人备考题库及完整答案详解一套
- 2026年陕西青年职业学院单招职业技能测试题库含答案详解(突破训练)
- 2026上半年新疆维吾尔自治区招聘事业单位工作人员分类考试4474人笔试备考题库及答案解析
- 【四年级】【数学】【春季下】开学家长会:与数同行共话梦想【课件】
- 2026年陕西航空职业技术学院单招职业技能测试模拟测试卷学生专用
- 2026年及未来5年中国面粉加工行业市场发展现状及投资方向研究报告
- 2026年春季统编版小学道德与法治四年级下册教学计划
- 2026年春季北师大版(2024)小学数学二年级下册教学计划
- 2026年内蒙古建筑职业技术学院单招职业技能考试题库及参考答案详解(新)
- 互联网企业网络安全管理制度(标准版)
- 1.1时代为我搭舞台(课件)-中职思想政治《心理健康与职业生涯》高教版2023基础模块
- 打击诈骗犯罪 警民同心发力 (课件)
- (新教材)2026年春期人教版二年级下册数学教学计划+教学进度表
评论
0/150
提交评论