ImageVerifierCode 换一换
你正在下载:

程序.docx

[预览]
格式:DOCX , 页数:22 ,大小:135.31KB ,
资源ID:7336542      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7336542.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(程序.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

程序.docx

1、程序字符串显示:例:编写一段显示字符串STRING的程序 DATA SEGMENT STRING DB HAPPY NEW YEAR!, 0DH , 0AH , $ COUNT DW 17 DATA ENDS MOV CX, COUNT MOV SI, 0 NEXT: MOV DL, STRINGSI MOV AH, 2 INT 21H ; 显示一个字符 INC SI(2)DOS显示字符串功能 LEA DX, STRING MOV AH, 9 INT 21H ; 显示一串字符,串必须以$结束 ; DS:DX=串地址字扩展顺序结构程序设计例 编写程序,计算(W-(X*Y+Z-100)/W,其中W

2、、X、Y、Z均为16位带符号数,计算结果的商存入AX,余数存入DX。 DATA SEGMENT W DW 268 X DW 73 Y DW 48 Z DW 85 DATA ENDS STACK SEGMENT DW 100 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATA MOV DS,AX MOV AX,X ;计算X*Y IMUL Y MOV CX,AX ;用CX存储结果低位 MOV BX,DX ;用BX存储结果高位 MOV AX,Z ;计算X*Y+Z CWD ADD CX,AX A

3、DC BX,DX SUB CX,100 ;计算X*Y+Z-100 SBB BX,0 MOV AX,W ;计算W-(X*Y+Z-100) CWD SUB AX,CX SBB DX,BX IDIV W ;商送AX,余数送DX MOV AH,4CH INT 21H CODE ENDS END START排序:例4-23 把从BUF单元开始的80个16位无符号数按从大到小的顺序排列。分析: 这是排序问题,无符号数的比较可以直接用比较指令CMP和条件转移指令JNC来实现 这又是双重循环问题,内循环使第1个数与下一个数比较,若大于则位置保持不变,小于则将大数放低地址,小数放高地址(两数交换),外循环进行7

4、9次,完成对80个无符号数的大小排序采用先执行后判断循环结构,程序流程图如图4-4所示。 DSEG SEGMENT BUF DW 80 DUP(?) ;已存入这80个字单元 DSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG START: MOV AX,DSEG MOV DS,AX LEA DI,BUF ;DI指向要排序的数的首址 MOV BL,79 ;外循环只需79次即可 LOOP1: MOV SI,DI ;SI指向当前要比较的数 MOV CL,BL ;CL为内循环计数器,循环次数每次少1 LOOP2: MOV AX,SI ;取第一个数NI ADD S

5、I,2 ;指向下一个数NJ CMP AX,SI ;NINJ? JNC NEXT ;若大于,则不交换 MOV DX,SI ;否则,交换NI和NJ MOV SI-2,DX MOV SI,AX NEXT: DEC CL ;内循环结束? JNZ LOOP2 ;若未结束,则继续 DEC BL ;外循环结束? JNZ LOOP1 ;若未结束,则继续 MOV AH,4CH ;返回DOS INT 21H CSEG ENDS END START逻辑尺:例 设有数组x(x1, , x10)和y(y1, , y10),编程计算 z1=x1 + y1 z2=x2 + y2 z3=x3 - y3 z4=x4 - y4

6、z5=x5 - y5 z6=x6 + y6 z7=x7 - y7 z8=x8 - y8 z9=x9 + y9 z10=x10 + y10 分析:逻辑尺:0 0 1 1 0 1 1 1 0 0 1 减法 0 加法 X DW X1,X2,X3,X4,X5,X6,X7,X8,X9,X10 Y DW Y1,Y2,Y3,Y4,Y5,Y6,Y7,Y8,Y9,Y10 Z DW Z1,Z2,Z3,Z4,Z5,Z6,Z7,Z8,Z9,Z10 LOGIC_RULE DW 00DCH MOV BX, 0 MOV CX, 10 MOV DX, LOGIC_RULE NEXT: MOV AX, XBX SHR DX,

7、1 JC SUBTRACT ADD AX, YBX JMP SHORT RESULT SUBTRACT: SUB AX, YBX RESULT: MOV ZBX, AX ADD BX, 2 LOOP NEXT进制转换例 把BX中的二进制以十六进制的形式显示在屏幕上 MOV CH, 4 ROTATE: MOV CL, 4 ROL BX, CL MOV AL, BL AND AL, 0FH ADD AL, 30H ;0-9 ASCII 30H-39H CMP AL, 3AH JL PRINTIT ADD AL, 7H ;A-F ASCII 41H-46H PRINTIT: MOV DL, AL M

8、OV AH, 2 INT 21H ;附录4,P357 DEC CH JNZ ROTATE例4-27 把一个二进制数转换为BCD码。 DATA SEGMENT HEX DW 1234H BCD DW 0,0 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AX,HEX XOR BX,BX ;用于存结果 MOV CX,0404H ;移位CL=4及循环次数CH=4 MOV BP,10 ;除数 LOOP1: XOR DX,DX DIV BP ROR DX,CL ROR BX,CL OR BX,

9、DX DEC CH JNZ LOOP1 MOV BCD,BX MOV BCD+2,AX MOV AH,4CH INT 21H CODE ENDS END START;将AX中的4位BCD码装换成16进制 DATA SEGMENT NUM DW 1234 DATA ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE START: MOV AX,DATA MOV DS,AX MOV BX,NUM MOV BP,0 MOV DI,4 L2: MOV CX,4 XOR AX,AX L1: RCL BX,1 RCL AX,1 ;AX=0001H LOOP L1 XCHG A

10、X,BP MOV SI,10 MUL SI XCHG AX,BP ADD BP,AX DEC DI JNZ L2 MOV AX,BP MOV AH,4CH INT 21H CODE ENDS END START 排序例:在自BLOCK开始的内存缓冲区中,有100个带符号的16位数,要找出其中的最大值,把它存放到MAX单元中。 MOV BX, OFFSET BLOCK MOV AX, BX INC BX INC BX MOV CX, 99 L1:CMP AX, BX JGE L2 (不小于则转移) MOV AX, BX L2:INC BX INC BX DEC CX JNZ L1 MOV MAX

11、, AX 数据的输入与输出输入一个字符:01使用中断21H,功能调用号为01H,将输入任意键入的字符,存入AL中(ASCII码)MOV AH,01HINT 21H输入字符串:0ADX=缓冲区首址 LEA DX,BUFMOV AH,0AHINT 21H例:输入字符串 ( AH=0ah ) 缓冲区的第一个字节保存最大字符数,这个最大字符数由用户程序给出。第二个字节是实际输入字符的个数,由功能A填入,不是由用户填入。在这两个字节之后,字符串按字节存入缓冲区,结束字符串的回车符0DH还要占用一个字节。(1)maxlen db 32 actlen db ? string db 32 dup (?) le

12、a dx, maxlen mov ah, 0ah int 21h输出一个字符:02使用02号功能,将DL中的字符显示出来MOV DL,XMOV AH,02HINT 21H输出字符串:09DX=串地址 串必须以$结束,光标跟随串移动LEA DX,DATAMOV AH,09HINT 21H例:显示单个字符 ( AH=2 ) mov ah, 2 mov dl, A int 21h例:显示字符串 ( AH=9 ) string db HELLO, 0dh, 0ah, $ lea dx, string mov ah, 9 int 21hEX1 从键盘上键入20个字符,将键入的字符按相同的顺序显示出来。键

13、入时,每键入一个字符,输出一个空格。 DATA DB 20 DUP(?) DSEG ENDS STACK1 SEGMENT DB 200 DUP(0) STACK1 ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG,SS:STACK1 START: MOV AX,DSEG MOV DS,AX LEA SI,DATA MOV CX,20 LP1: MOV AH,01H INT 21H MOV SI,AL INC SI MOV DL,20H MOV AH,02H INT 21H LOOP LP1 LEA SI, DATA ;若要相反顺序输出,此句省略 MOV CX,

14、14H MOV DL,0DH ;回车 MOV AH,02H INT 21H MOV DL,0AH ;换行 MOV AH,02H INT 21H LP2: MOV DL,SI MOV AH,02H INT 21H INC SI ;若要相反顺序输出,此句改为 DEC SI LOOP LP2 MOV AH,4CH INT 21H CSEG ENDS END START NAME DATAS SEGMENT STRING DB WHATS YOUR NAME?$ ;显示字符串 !注意要加$! ;输入字符串 DA1 DB 32 ;输入字符串最大长度为32位(字符串都用DB定义) DB ? ;输入字符串实

15、际长度为? DB 32 DUP(?) ;最大长度32位下的实际语句定义 DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX ;这里开始初始化 MOV DX,OFFSET STRING MOV AH,09H INT 21H ;DOS功能调用,显示字符串 WHATS YOUR NAME? LEA DX,DA1 MOV AH,0AH INT 21H ;键入到缓冲区,即把键入的字符串存到DS:DX MOV AH,4CH INT 21H CODES ENDS END START相加例、1+2+3+

16、100=?并显示出来。 DATA SEGMENT BUF DB 8 DUP(0) ;最大长度8,初值0 DATA ENDS STACK1 SEGMENT DB 200 DUP(0) STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1 START: MOV AX,DATA MOV DS,AX MOV BX,1 ;加数 MOV AX,0 ;和 MOV CX,100 ;次数 L1: ADD AX,BX INC BX LOOP L1 ;5050 MOV CX,0 MOV BX,10 LEA SI,BUF L2: MOV DX,0 DIV

17、BX PUSH DX ;保存余数 INC CX ;保存个数计数 OR AX,AX JNE L2 ;商AX不为0则循环 L3: POP DX ADD DL,30H MOV SI,DL INC SI DEC CX JNE L3 MOV SI,BYTE PTR 0DH 先生成表格再输出 MOV SI+1,BYTE PTR 0AH MOV SI+2, BYTE PTR $ LEA DX,BUF; MOV AH,09H INT 21H MOV AH,4CH INT 21H CODE ENDS END STARTMIN DATA SEGMENT ;数据段 DAT1 DB 22H,1AH,4DH,6EH,9

18、FH D DB ? DATA ENDS CODE SEGMENT ;代码段 ASSUME CS:CODE,DS:DATA START: MOV AX,DATA ;初始化 MOV DS,AX LEA SI,DAT1 MOV CX,5 CLD LODSB MOV D,AL ;将该数送至D DEC CX NEXT: LODSB ;取下一个数 CMP AL,D JL SMALL JMP GOON SMALL: MOV D,AL GOON: LOOP NEXT MOV AX,4C00H ;退出程序 INT 21H CODE ENDS END STARTSTRING DATAS SEGMENT ;数据段

19、STR1 DB ZI YUAN AO STR2 DB I LOVE YOU DATAS ENDS CODES SEGMENT ;代码段 ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS ;初始化 MOV DS,AX LEA SI,STR1 LEA DI,STR2 MOV CX,10 CLD REP MOVSB MOV AX,4CH ;退出程序 INT 21H CODES ENDS END STARTWXYZ DATA SEGMENT ;数据段 X DW 0001H Y DW 0002H Z DW 0003H W DW 0004H DATA ENDS CO

20、DE SEGMENT ;代码段 ASSUME CS:CODE,DS:DATA START: MOV AX,DATA ;初始化 MOV DS,AX MOV AX,X IMUL Y MOV BX,AX MOV CX,DX MOV AX,Z CWD ADD BX,AX ADC CX,DX SUB BX,100 SBB CX,0 MOV AX,W CWD SUB AX,BX SBB DX,CX IDIV X MOV AX,4C00H ;退出程序 INT 21H CODE ENDS END STARTZERO DATA SEGMENT ;数据段 D DW ? A DW 1 B DW 2 C DW 3 D

21、ATA ENDS CODE SEGMENT ;代码段 ASSUME CS:CODE,DS:DATA START: MOV AX,DATA ;初始化 MOV DS,AX CMP A,0 JNZ NEXT CMP B,0 JNZ ZERO CMP C,0 JNZ ZERO OR A,1 OR B,1 OR C,1 JMP OK NEXT: CMP B,0 JZ ZERO CMP C,0 JZ ZERO MOV AX,A ADD AX,B ADD AX,C MOV D,AX JMP OK ZERO: AND A,0 AND B,0 AND C,0 OK: MOV AX,4C00H ;退出程序 INT

22、 21H CODE ENDS END START串处理编程实现两个长度都是10个字符的字符串str1(在数据段中)和 str2(在附加段中)比较。如果两串完全相等,则跳转到 rout1执行,否则继续执行。 LEA SI,STR1 LEA DI,STR2 CLD MOV CX,10 REPE CMPSB JCXZ ROUT1 x ROUT1: 例 比较两个字符串是否有相同的元素,它们的首地址和目标地址分别为SRC和DEST,字符串的长度为N个字节。CLD ;DF=0,增量方向LEA SI,SRC ;DS:SI字符串首地址LEA DI,ES:DEST ;ES:DI目标地址MOV CX,N ;字符串

23、长度REPNE CMPSB ;重复比较字符串JNZ NOT_FOUND ;无相同的元素, 转NOT_FOUND, 否则继续执行下条指令例 在首地址为ES:DEST的字符串中检查是否有字符M,字符串的长度为N个字节。CLD ;DF=0,增量方向LEA DI,ES:DEST ;ES:DI目标地址MOV CX,N ;字符串长度MOV AL,M ;AL搜索字符REPNE SCASB ;重复搜索字符串是否 有字符M例 将首地址为DS:SRC的字节数据串中非0元素送到首地址为ES:DEST的内存区中。字符串长度为N。 CLD ;DF=0,增量方向 LEA SI,SRC ;DS:SI字符串首地址 LEA D

24、I,ES:DEST ;ES:DI目标地址 MOV CX,N ;字符串长度 GOON: LODSB ;取字符串的一个元素 CMP AL,0 ;字符串元素为0吗? JZ NEXT ;是0,继续下一个元素 STOSB ;非0,存入首地址为ES:DEST的内存区中 NEXT: DEC CX JNE GOON 分类例 若在内存缓冲区有一个数据块,起始地址为BLOCK,若数据块中有正负数,要把正负分开,正数放缓冲区的起始地址为PLVS_DATA ,负的放MINVS_DATA 设SI源数指针DI BX负数目的区指针 LODS指令把源数送到AL中 MOV SI, OFFSET BLOCK MOV DI, OF

25、FSET PLVS_DATA MOV BX, OFFSET MINVS_DATA MOV CX, COUNT 循环次数GOON: LODS BLOCK TEST AL, 80H 检查其符号位,为负,则MIVS JNZ MIVS STOSB 正数存入PLVS-DATA JMP AGAINMIVS: XCHG BX, DI STOSB XCHG BX, DIAGAIN: DEC CX JNZ GOON HLT例 在存储器中有一个首地址为ARRAY的N字数组,要求测试其中正数、0及负数的个数,正数的个数放在DI中,0的个数放在SI中,并根据N-(DI)-(SI)求得负数的个数放在AX中,如果有负数则

26、转移到NEG_VAL中去执行。 MOV CX,N NEXT:ADD BX,2 MOV BX,0 DEC CX MOV DI,BX JNZ AGAIN MOV SI,BX MOV AX,NAGAIN:CMP ARRAYBX,0 SUB AX,DI JLE LESS-OR-EQ SUB AX,SI INC DI JZ SKIP JMP SHORT NEXT JMP NEAR PTR NEG-VAL LESS-OR-EQ:JL NEXT SKIP: INC SI NEG-VAL:例3-54在以DATA为首地址的内存数据段中,存放有200个16位有符号数,试找出其中最大和最小的有符号数,并分别放在MA

27、X和MIN为首的内存单元中比较有符号数的大小,应采用JG和JL等用于有符号数的条件转移指令 START: LEA SI,DATA ;(SI) 数据块首地址 MOV CX,200 ;(CX) 数据块长度 CLD ;清方向标志DF LODSW ;(AX)一个16位有符号数 MOV MAX,AX ;将该数送MAX MOV MIN,AX ;将该数送MIN DEC CX ;(CX) (CX)-1NEXT: LODSW ;取下一个16位有符号数 CMP AX,MAX ;与MAX单元内容进行比较 JG LARGER ;若大于则转LARGER CMP AX,MIN ;否则再与MIN单元内容进行比较 JL SMALL ;若小于MIN的内容则转SMALL JMP GOON ;否则就转至GOONLARGER:MOV MAX, AX ;(MAX) (AX) JMP GOON SMALL: MOV MIN,AX ;(MIN) (AX)GOON: LOOP NEXT ;(CX)-1,若CX0,则转NEXT

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1