data segmentfault buf db 10 db ? db 10 dup(?) show db 'inp...

求分析汇编程序功能…… DATA SEGMENT DA1 DB 10 DUP(2,3) DA2 DW 10 DUP(0203H) DA3 DB DATA ENDS CODE
DATA SEGMENT ;定义数据段,数据段名为:DATADA1 DB 10 DUP(2,3) ;上句定义20个字节(BYTE)型数据存储单元,名为DA1,初始值为2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3DA2 DW 10 DUP(0203H) ;上句定义10个字(WORD)型数据存储单元,名为DA2,初始值均为0203H(十六进制数)DA3 DB ;定义1个字节(BYTE)型数据存储单元,名为DA3,未赋初始值DATA ENDS ;数据段结束CODE ;此处为代码段名,以下应开始定义代码段了……
这个后面还有……ST:
整个实现了什么功能啊
你追问的内容属于代码段的部分,先逐行说明:
DS,AX 以上这两句作用是将数据段DATA与数据段寄DS存器相关联
BX,DA1将DA1首地址送入BX
SI,SI 利用异或指令清零SI寄存器
AL,AL利用异或指令清零AL寄存器
CX,10将CX寄存器赋初值10,作为循环计数初始值
AL寄存器的内容加上DA1中某一字节单元的内容(每次循环都是不同的字节单元),结果保存在AL
AL寄存器的内容加上DA2中某一字节单元的内容(每次循环都是不同的字节单元,而且是从开始算起第奇数个字节单元),结果保存在AL
SI,2SI寄存器的值加2
BXBX寄存器的值加1
LP循环语句:只要CX的值不为0,便跳转至标号LP处继续执行
DA3,AL将AL的值存入DA3
21H这两句表明程序退出
ENDS代码段结束伪指令
ST全部汇编源程序结束伪指令
【整体功能】:
由于DA1中数据为:
2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3
02H,03H,02H,03H,02H,03H,02H,03H,02H,03H,
02H,03H,02H,03H,02H,03H,02H,03H,02H,03H
DA2中数据为:
03H,02H,03H,02H,03H,02H,03H,02H,03H,02H,
03H,02H,03H,02H,03H,02H,03H,02H,03H,02H
在你给出的程序的循环体中,将DA1的前10个数据以及DA2的第1、3、5、7、9、11、13、15、17、19个 数据(一共20个数据)做和,结果为5*5+3*10=25+30=55(十进制的),十六进制形式就是37H。
解释一下,为什么字型数据0203H在内存中变成了03H,02H,这是由于80X86处理器对存储器的组织方式是“小端存储”方式,所以,在字节上,顺序有所颠倒。
为您推荐:
其他类似问题
扫描下载二维码当前位置: >>
汇编语言实验报告
合肥工业大学 计算机与信息学院 实验报告课 程:汇编语言程序设计专业班级:计算机科学与技术 11-4 班 学 姓 号: 名: 实验一一. 实验目的Debug 程序的使用1、熟悉 DEBUG 程序中的命令,学会在 DEBUG 下调试运行汇编语言源程序。 2、掌握
的寻址方式及多字节数据的处理方法。 二. 实验内容 1 、利用 DEBUG 程序中的“ E ”命令,将两个多字节数“ 003F1AE7H ”和 “006BE5C4H”分别送入起始地址为 DS:0200H 和 DS:0204H 两个单元中。 2、分别用直接寻址方式和寄存器间接寻址方式编写程序段,实现将 DS:0200H 单元和 DS:0204H 单元中的数据相加,并将运算结果存放在 DS:0208H 单元中。 要求: 本次实验的内容均在 DEBUG 下完成,实现数据的装入、修改、显示;汇编 语言程序段的编辑、汇编和反汇编;程序的运行和结果检查。 三. 实验过程和程序 1、启动 DOS 操作系统 2、运行
程序–;(“– ”为 DEBUG 提示符,仅当屏幕出现该提示 符后,才可输入 DEBUG 命令) 3、用“A”命令编辑和汇编源程序 –A ↙ 186E :E :E :E :010B 186E :010F 186E :E :0116 MOV MOV ADD ADC MOV MOV ↙ AX,[0200]↙ BX,[0202]↙ AX,[0204]↙ BX,[0206]↙ [0208],AX ↙ [020A],BX ↙4、用“U”命令反汇编验证源程序 –U CS:0100↙ 186E: MOV 186E:E0202 MOV 186E:2 ADD 186E:010B 131E0602 ADC 186E:010F A30802 MOV 186E:A02 MOVAX,[0200] BX,[0202] AX,[0204] BX,[0206] [0208],AX [020A],BX 186E:0116– 注意:? ? ? ?检查源程序是否有错误,若有则返回到第 3 步用“A 地址”命令进 行修改,直到程序无错误。 DEBUG 约定在其命令或源程序中所涉及到的数据均被看作十六进 制数,其后不用“H”说明。 在 DEBUG 下,源程序中不能使用“标号” 、 “变量”和一些伪指令。 在 DEBUG 下,大小写不敏感。5、程序未执行前,用“R”命令观察,相关寄存器的内容。 –R↙ 如: (AX)= 0000 , (BX)= 0000 , (SI)= 0000 (DI)= 0000 单元的内容 –D 200 20B ↙ 7、用“G”命令运行源程序 –G =100 0116 ↙ 8、再用“D”命令观察 DS:0200H~DS:020BH 字节单元中的内容 –D 200 20B↙ 9、用“T”单步操作命令对源程序单步执行,观察 AX、BX、CS、IP 寄存 器内容的变化,并与预计的结果相比较。 , (CS)= 073f , (IP)= 0100 。 ,6、在程序未执行前,用“ D”命令观察 DS:0200H , DS:0204H、DS:0208H四. 实验结果(包括必要的截图) 1、程序运行结果: (AX)=00AB , (BX)= 00AB DS:0208H 四字节单元的内容: AB 00 AB 00 2 试用寄存器间接寻址方式编写程序段,完成上述程序段的功能 程序代码: 1、 用寄存器寻址实现以上功能: -a 13E3:0133 mov si,200 13E3:0136 mov di,204 13E3:0139 mov bx,208 13E3:013C mov ax,[si] 13E3:013E mov dx,[si+2] 13E3:0141 add ax,[di] 13E3:0143 adc dx,[di+2] 13E3:0146 mov [bx],ax 13E3:0148 mov [bx+2],dx 13E3:014B -g=133 14b五. 实验体会 这次的实验是调试程序 Debug 的使用, 虽然很简单只是按实验步骤输入指令 或数据然后等待结果就行了,但这很重要重在观察调试的过程,和程序的运作。 当中要注意的细节也很多这是我应该注意的,这对于我们后面的学习很重要。 实验二一. 实验目的汇编语言程序设计(顺序、循环)1、掌握顺序和循环程序结构和设计方法; 2、熟悉在 PC 机上建立、汇编、连接、调试和运行
汇编语言程序的过程。二. 实验内容 1、X、Y、Z、V 均为字变量,在 X、Y、Z、V 字单元中存放是 16 位带符号数。 试编写汇编语言程序完成以下功能: ①计算表达式值(V–(X*Y+Z-720) )/X; ②将上述表达式运算结果整数放在 SUM1 单元,余数放在 SUM2 单元。 2、求一个班 50 名学生成绩的平均值(附加题:最大值和最小值,并将结果显示 出来) 3、从键盘读入一个字符串,以 Enter 结束,字符串不超过 50 个字符,并打印 该字符串(附加题:查找中间是否有‘asm’子串。如果有,输出‘Yes’ ;否则, 输出‘No’)。 三. 实验过程和程序 1.先用 windows 自带的文本编辑器编辑源代码文件,以 txt 格式保存 2.为了方便起见,把 txt 文件放到 masm.exe 的目录中 3.然后打开 cmd,进入到存放 masm 的目录中, 运行 masm *.txt 连续按下回车键, 就会在目录中生成 obj 文件 4.然后运行 link *.obj 就可以对 obj 文件进行连接生成 exe 文件 5.可以直接输入文件名运行程序了 6.在 debug 下查看结果或直接运行 exe 文件验证 程序源代码: 1. Stack segment stack dw 512 dup(?) Stack ends Data segment x dw 2 y dw 5 z dw 720 v dw 20 sum1 dw ?,'$' sum2 dw ?,'$' sum dw ? Data ends Code segment assume cs:code, ds:data, ss:stack start: mov ax,data mov ds,在代码段填入指令序列(V–(X*Y+Z-720) )/X mov ax,x*y mov cx,ax mov bx,dx mov ax,z cwd add cx,ax adc bx,dx sub cx,2d0h sbb bx,0 mov ax,v cwd sub ax,cx sbb dx,V–(X*Y+Z-720) ;(V–(X*Y+Z-720) )/Xmov SUM1,ax mov sum,dx mov ax,seg SUM1 mov ds,ax mov dx,offset SUM1 mov ah,9 int 21h mov ax,sum mov SUM2,ax mov ax,seg SUM2 mov ds,ax mov dx,offset SUM2 mov ah,9 int 21h mov ah,4ch int 21h Code ends end start 2. code segment assume cs:code,ds:code str db 10 dup (4bh,50h,55h,5ah,5fh) ;定义 50 个分数 start: mov ax,code mov ds,ax mov bx,0h mov si,bx mov cx,32计数 50 mov ax,0h next: add al,str[si] adc ah,0h inc si loop next mov bl,32h idiv bl mov dl,al mov dh,ah mov ah,02h int 21h mov dl,dh mov ah,02h int 21h mov ah,4ch int 21h code ends end start 3. data segment prompt db 'Input a string:$' buf db 33h,?,51 dup(?) Lf db 0ah yes db 'Yes$' no db 'No$' data code start: mov ax,data mov ds,ax lea dx,prompt mov ah,9 int 21h lea dx,buf mov ah,0ah int 21h mov dl,Lf mov ah,2 int 21h mov cl,buf+1 mov ch,0 lea bx,buf+2 add bx,cx mov byte ptr [bx],'$' lea dx,buf+2 mov ah,9 int 21h mov dl,Lf mov ah,2 int 21h sub cx,2 mov si,2 L: mov bl,buf[si] cmp bl,61h jnz next mov bl,buf[si+1] ends segment assume cs:code, ds:data cmp bl,73h jnz next mov bl,buf[si+2] cmp bl,6dh jnz next lea dx,yes mov ah,9 int 21h jmp Last next: inc si loop L lea dx,no mov ah,9 int 21h Last: mov ah,4ch int 21h Code ends end start四. 实验结果(包括必要的截图)
实验三一. 实验目的汇编语言子程序设计(分支、子程序)1、掌握分支和子程序结构和设计方法; 2、熟悉在 PC 机上建立、汇编、连接、调试和运行
汇编语言程序的过程。 3、通过汇编语言了解高级语言的参数传递等知识。二. 实验内容 1、1. BL 中的只有一位为 1。编写程序测试,并输出提示信息“The X Bit is 1” , 要求:地址表和转移表。 2. 编写一个子程序计算 z=f(x,y)=x*y+x-y(x,y,z 有符号数内存数) 。要求通过堆 栈(寄存器、内存)传送所有参数。三. 实验过程和程序 1.先用 windows 自带的文本编辑器编辑源代码文件,以 txt 格式保存 2.为了方便起见,把 txt 文件放到 masm.exe 的目录中 3.然后打开 cmd,进入到存放 masm 的目录中,运行 masm *.txt 连续按下回车键, 就会在目录中生成 obj 文件 4.然后运行 link *.obj 就可以对 obj 文件进行连接生成 exe 文件 5.可以直接输入文件名运行程序了 6.在 debug 下查看结果或直接运行 exe 文件验证 程序源代码: 1.DATA SEGMENT STRING1 DB 'THE 1 BIT IS 1!$' STRING2 DB 'THE 2 BIT IS 1!$' STRING3 DB 'THE 3 BIT IS 1!$' STRING4 DB 'THE 4 BIT IS 1!$' STRING5 DB 'THE 5 BIT IS 1!$' STRING6 DB 'THE 6 BIT IS 1!$' STRING7 DB 'THE 7 BIT IS 1!$' STRING8 DB 'THE 8 BIT IS 1!$' DATA ENDSCODESEGMENTASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AXMOV DX,0 MOV BL,B MOV CX,8 MOV AL,BL L0: SHL AL,1 JC OVER ADD DX,3 LOOP L0 OVER: LEA SI,JMPTABLE ADD SI,DX JMP SI JMPTABLE: JMP NEAR PTR L1 JMP NEAR PTR L2 JMP NEAR PTR L3 JMP NEAR PTR L4 JMP NEAR PTR L5 JMP NEAR PTR L6 JMP NEAR PTR L7 JMP NEAR PTR L8 L1: LEA DX,STRING1 JMP LAST L2: LEA DX,STRING2 JMP LAST L3: LEA DX,STRING3 JMP LAST L4: LEA DX,STRING4 JMP LAST L5: LEA DX,STRING5 JMP LAST L6: LEA DX,STRING6 JMP LAST L7: LEA DX,STRING7 JMP LAST L8: LEA DX,STRING8 LAST: MOV AH,9 INT 21HMOV AH,4CH INT 21H CODE ENDS END START1.2DATA SEGMENT STRING1 DB 'THE 1 BIT IS 1!$' STRING2 DB 'THE 2 BIT IS 1!$' STRING3 DB 'THE 3 BIT IS 1!$' STRING4 DB 'THE 4 BIT IS 1!$' STRING5 DB 'THE 5 BIT IS 1!$' STRING6 DB 'THE 6 BIT IS 1!$' STRING7 DB 'THE 7 BIT IS 1!$' STRING8 DB 'THE 8 BIT IS 1!$' AddrTable dw L1,L2,L3,L4,L5,L6,L7,L8DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AXMOV si,0 MOV BL,B MOV CX,8 MOV AL,BL L0:SHL AL,1 JC OVER add si,2 LOOP L0OVER: ;lea bx,AddrTadd bx,dx jmp AddrTable[si]L1: LEA DX,STRING1 JMP LAST L2: LEA DX,STRING2 JMP LAST L3: LEA DX,STRING3 JMP LAST L4: LEA DX,STRING4 JMP LAST L5: LEA DX,STRING5 JMP LAST L6: LEA DX,STRING6 JMP LAST L7: LEA DX,STRING7 JMP LAST L8: LEA DX,STRING8 LAST: MOV AH,9 INT 21H MOV AH,4CH INT 21H CODE ENDS END START2DATA SEGMENT RESULT DW ? X Y DB 8 DB 3DATA SSEGENDS SEGMENTDW 512 DUP (?) SSEG CODE ENDS SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AXCALL FUCTION MOV AX,RESULT MOV BL,10 IDIV BLADD ADDAL,30H AH,30HMOVBL,AHMOV MOV INT 21HDL,AL AH,02HMOV MOV INT 21HDL,BL AH,02HMOV AH,4CH INT 21HFUCTION PROC PUSH AX PUSH BX PUSH CX MOV AL,X IMUL Y MOV BX,AX MOV AL,X CBW ADD BX,AX MOV AL,Y CBW SUB BX,AX MOV RESULT,BX POP CX POP BX POP AX RET FUCTION ENDPCODE ENDS END START四. 实验结果(包括必要的截图) 实验四一. 实验目的汇编语言高级编程专题1、汇编语言宏程序设计; 2、 掌握中断服务子程序的编写。二. 实验内容 1、编写一个宏,求三个数的最小数,原型为:MIN3 x,y,z,min 2、挂接 1CH 中断,正计时 60 秒后退出。要求屏幕显示 0-59 的秒数。三. 实验过程和程序1.先用 windows 自带的文本编辑器编辑源代码文件,以 txt 格式保存 2.为了方便起见,把 txt 文件放到 masm.exe 的目录中 3.然后打开 cmd,进入到存放 masm 的目录中,运行 masm *.txt 连续按下回车键,就会在目录 中生成 obj 文件 4.然后运行 link *.obj 就可以对 obj 文件进行连接生成 exe 文件 5.可以直接输入文件名运行程序了 6.在 debug 下查看结果或直接运行 exe 文件验证 程序源代码:1、 MIN3 macro a,b,c local Next1,Next2,Done mov al,a cmp al,b ja Next1 cmp al,c ja Next2 jmp Done Next1: mov al,b cmp al,c ja Next2 jmp Done Next2: mov al,z Done: mov dl,al mov ah,2 int 21h endm data segment min x y z InP data ends code segment assume cs:code,ds:data Start: mov ax,data mov ds,ax mov dx,offset InP mov ah,9 int 21h mov ah,1 int 21h mov x,al mov ah,1 int 21h mov y,al mov ah,1 int 21h mov z,al mov dx,offset Wrap mov ah,9 int 21h db ? db ? db ? db ? db 'Input the number:','$'Wrap db 0dh,0ah,'$' MIN3 x,y,z mov ah,4ch int 21h code ends end Start 2、INTNO EQU 1CH USEINT = 1DATA SEGMENT OLDISR DW ?,? TIMER DB 100 COUNTER DW 0 ISDONE DB 60 DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AXMOV AX,60 MOV ES,AX;PROTECT IF USEINT MOV AL, INTNO MOV AH,35H INT 21H ;ES:BX MOV OLDISR[0], BX MOV AX,ES MOV OLDISR[2], AX ELSE CLI MOV AX, ES:[INTNO*4] MOV OLDISR[0],AX MOV AX,ES:[INTNO*4+2] MOV OLDISR[2], AX STI ENDIF;SET NEW ISR IF USEINT PUSH DS MOV AX, SEG ISR MOV DS,AX MOV DX, OFFSET ISR MOV AL, INTNO MOV AH, 25H INT 21H POP DS ELSE CLI MOV WORD PTR ES:[INTNO*4], OFFSET ISR MOV WORD PTR ES:[INTNO*4+2],SEG ISR STI ENDIF;WAIT HERE WAITHERE: CMP ISDONE,1 JNZ WAITHEREEXIT: ;RESTORE IF USEINT PUSH DS MOV DX,OLDISR[60] MOV AX,OLDISR[2] MOV DS,AX MOV AL, INTNO MOV AH, 25H INT 21H POP DS ELSE CLI MOV AX,OLDISR[60] MOV ES:[INTNO*4],AX MOV AX,OLDISR[2] MOV ES:[INTNO*4+2],AX STI ENDIFMOV AX,4C00H INT 21HISR PROC FAR PUSH DX PUSH AXMOV AX,DATA MOV DS,AXSTI;便于中断嵌套;COUNT HERE INC TIMER AGAIN: CMP TIMER, 1000/55 JB DONE MOV TIMER,60 ;carriage MOV AH,2 MOV DL,13 INT 21H ;print time MOV AX,COUNTER MOV DL,10 DIV DL ;18 MOV DH,AH MOV DL,AL MOV AH,2 ADD DL,30H INT 21H MOV DL,DH ADD DL,30H INT 21H DEC COUNTER JGE DONE MOV ISDONE,1 DONE: PUSHF CALL DWORD PTR OLDISR CLI POP AX POP DX IRET ISR ENDP ;中断返回CODE ENDS END START四. 实验结果(包括必要的截图) 五. 实验体会学习汇编语言都要有着深刻的理解和认识, 其中需要注意的细节很多要记住的东西也很 多,各个方面指令助记符,要会用过程,宏等,这次的实验要用汇编语言中的宏程序设计 编写,这需要对宏程序有着深刻的认识分清它与高级语言中的区别。
汇编语言实验报告 学院:计算机学院 专业:网络工程 指导老师:纪平 实验一一、实验目的 汇编语言程序调试方法 ,1,熟悉汇编语言运行环境和方法 2,了解如何使用汇编语言...汇编语言实验报告_工学_高等教育_教育专区。燕山大学实验报告 实验一 汇编语言的源程序的输入 一, 实验目的 1. 通过实验了解和熟悉微机系统的配置 2. 学习在 ...学生实验报告册 2011——2012 学年第 1 学期 实验名称: 汇编语言程序设计 学院: 信息与电气工程学院 班级: 09 级计算机科学与技术 2 班 学号:
姓名:...汇编语言实验报告 第六章 磁盘文件存取实验(设计性实验) 班级: 姓名:肖枫 学号: 实验日期:下午 第六章磁盘文件存取实验(设计性实验) ...汇编语言实验报告_化学_自然科学_专业资料。汇编语言课程设计 学院: 专业: 姓名: 学号: 1 汇编语言是计算机专业的一门重要的专业基础课,主要 介绍汇编语言程序设计...汇编实验报告4_电脑基础知识_IT/计算机_专业资料。四川大学计算机学院、软件学院 ...计算机科学与技术 汇编语言程序设计课程设计(第四次) 实验课时 30 课时 实验...南华大学计算机科学与技术学院 实验报告(
学年度 第二 学期 ) 课程名称 实验名称 汇编语言与接口技术 汇编实验 姓名 Xx 学号 Xx 专业 软件工程 班级...福建农林大学金山学院 (程序设计类课程) 实验报告课程名称: 姓名: 系: 专年学业: 级: 号: 汇编语言 指导教师: 职称:
学年第二学期 实验项目列表 ...汇编实验报告 - 《汇编语言程序设计》 实验报告系专年学姓别业级号名 西南交通大学信息科学与技术学院 2012 年 6 月 实验一 实验二 实验三 实验四 实...2页 免费 汇编语言实验五 8页 2财富值如要投诉违规内容,请到百度文库投诉中心;如要提出功能问题或意见建议,请点击此处进行反馈。 ...
All rights reserved Powered by
copyright ©right 。文档资料库内容来自网络,如有侵犯请联系***。第六章 循环程序设计_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
第六章 循环程序设计
上传于||暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩20页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢1847人阅读
&微型机原编训
第一章 IBM PC系列微机的操作
ASM64KB;MASM96KB
(WORDSTAREDLIN);
DOS19952.0
1.2.1 EDIT
EDITDOSDOS
[]EDITEDIT
11Line1Col1
1.2.3 EDIT
1.2.4 命令菜单的使用
依编辑窗口下边的提示,按下Alt键即进入菜单。这时编辑窗口上边的六个命令项(FILE,EDIT,SEARCH,VIEW,OPTIONS,HELP)的第一个字母呈高亮度显示,光标停在第一个命令File上。为了选择其中一个命令项,可以键入高亮度字母F,E,S,V,O,H之一,或用
Window Ctrl+F6
NEWOPENS***ES***E ASPRINTEXITNOSAPX&&键移动光标到所选项后再回车。
(1) NEW命令& 选中NEW命令后,屏幕显示:编辑的文件没有存盘,现在存盘吗?用TAB键选择屏幕上的YES则存盘,选择NO则放弃存盘,选择CANCEL则退出命令,选择HELP则提供帮助信息,用TAB键可使光标停在OK上回车,即回到原菜单。
(2) OPEN命令& 选中OPEN命令后,键入一个已经建立的文件的路径和名字,则可在原编辑屏幕上打开和显示这个文件内容。
(3) S***E命令& 选中S***E命令后,则将编辑的文件存盘,如果没有文件名,则要求输入一个文件名。
(4) S***E AS命令& 选中PRINT命令后,若编辑的文件有文件名,则认可后按回车键。若要修改文件名或原来没有文件名,则输入新的文件名再按回车键。不论哪种情况,按回车键后文件存盘。修改文件名的时候,老文件仍然留在盘上。
(5) PRINT命令&& 选中PRINT命令,可以打印部分文本或全部文本。如果光标在帮助窗口,则可以打印部分或全部帮助文本。
(6) EXI命令&& 选中EXIT命令,则退出命令菜单。如果文件没有存过盘,则将提醒用户存盘。
2) EDIT命令项
用&&键可以移动光标到CUT,COPY,PASTE,CLEAR四个子命令之一上,但按回车键盘能输入光标所在处命令。这四个子命令也没有高亮度字母显示。这是因为在使用这四个子命令之前,必须先定义文件块。
当文件块定义好之后,再进入EDIT命令菜单时,字母T,C,E呈高亮度显示。可以键入高亮度字母T,C,E之一,或用&&键移动光标到反选项后再回车,选择CUT或COPY或CLEAR子命令。
(1) CUT和PASTE命令& CUT命令和PASTE两命令结合,可以完成文件块的移动。
在文件块定义好之后,选择CUT命令从原来位置消失。这时可将光标移到欲插入这个文件块的地方,再进入EDIT命令时,PASTE的第一个字母P也呈高亮度显示。按下字母P,或将光标移到PASTE命令,然后按下ENTER键,于是就插入了这个文件块。
多次选用PASTE命令,可以在多处重复插入这个文件块,还可以在一个打开的新文件或已建立的老文件中插入这个文件块。
(2) COPY命令和PASTE命令& COPY和PASTE两命令结合,可以完成文件的复制。
定义了文件块之后,选择COPY命令,定义的文件块没有变化。将光标移到欲复制这个文件块的地方,选择PASTE命令,就复制了这人文件块。
多次选用PASTE命令,可以在多处重复插入这个文件块,还可以在一个打开的新文件或已建立的老文件中插入这个文件块。
(3)CLEAR命令& 定义了文件块后,选择CLEAR命令,将把这个文件块从文件中删除。
EDIT的四个子命令也可以用按键选择:CUT命令用SHITF+DEL键,COPY命令用CTRL+INS键,PASTE命令用SHIFT+INS键,CLEAR命令有DEL键。
3) SEARCH命令项
为了选择FIND,REPEAT LAST FIND,REPLACE三个子命令之一,可以键入高亮度字母F,L,R之一,或用&&键移动光标到所选项后再回车。REPEAT LAST FIND命令也可用按键F3选择。
(1) FIND命令& 选中FIND命令,屏幕将显示提问:找什么?这时输入要查找的字符串,长度最多127个字符。若文件中几处出现这个字符串,则找到的是从原光标位置算起第一次出现的字符串。若文件中没有这个字符串,则屏幕显示找不到。
(2) REPEAT LAST FIND命令& 选中PEPEAT LAST FIND命令,将重复上次的查找。不断地选用这个命令,将把文件中所有这样的字符串查找出来。如果文件中这个字符串只出现了一次,则使用这个命令后光标位置不变。
(3) REPLACE命令& 选中REPLACE命令,屏幕将显示提问:找什么?回答后,按TAB键,继续提问:换成什么?回答完了则光标后面第一个找到的字符串被一个新的字符串替换了。如果要找的字符串不止一个,则按下一次ENTER键,有一个字符串被替换,直到所有相同的字符串被替换完毕。
4)VIEW命令
在该命令项***中SPLIT WINDOW,SIZE WINDOW,CLOSE WINDOW及1 UNTITLED1四个子命令。仅有SPLIT WINDOW和1 UNTITLED1两个子命令中的S、1呈高亮度,但如使用了SPLIT WINDOW子命令后,其余两个子命令中的I和C即呈高亮度。可用&&键移动光标选择使用,也可用按键CTRL+F6,CTRL+F8,CTRL+F4及ALT+L选择使用。
(1) SPLIT WINDOW命令& SPLIT WINDW命令用于将屏幕一分为二,光标停在下面第一行第一列的位置,输入的内容同时送入上下两个屏幕,但光标的移动不会影响另一屏幕。用F6键可使光标在两个屏幕之间移动。
(2) SIZE WINDOW命令& 当分屏后,选中该命令可用&&键改变两个屏幕的大小,改完后按回车键确认。
(3) CLOSE WINDOW命令& 选中该命令可将原来的两个屏幕合二为一。
(4) 1 UNTITLED1命令& 如果使用EDIT[文件名]命令,其中[文件名]是多个文件名时,则在VIEW命令项中将这些文件名依次列出,并在前面加上序号,且序号呈高亮度,选中一序号即将序号后的文件显示在屏幕上,以供编辑。
5) OPTIONS命令项
为了选择SETTING和COLORS两个子命令之一,可以键入高亮度字母S,C之一,或用&&键移动光标到所选项后再回车。
(1) SETTING命令& 使用该命令可以设置:
① TAB键的宽度。 默认值为8列。
② 打印口的位置。可按TAB键移动光标,选择打印口的位置,然后按回车键确认。
(2) COLORS命令& COLORS 命令用于确定屏幕显示的前景与背景颜色。前景提供了蓝,绿,青,红,洋红,棕,白7种颜色。背景提供了黑,绿,青,红,洋红,棕7种颜色。选中COLORS命令后,可用TAB键选项,用&&键移动光标到所选颜色后按回车。按&&键能在选择屏幕上同时有选择效果显示。
6) HELP命令
为了选择COMMANDS,ABOUT两个命令之一,可以键入高亮度字母C,A之一,或用&&键移动光标到所选顶后再回车。
① COMMANDS命令(见表1.1)
② ABOU命令& 选中这个命令将显示MS-DOS EDITOR的版本号及版权信息。
1.2.5 EDIT的使用条件
EDIT命令运行QBASIC.EXE文件和EDIT核心文件。如果要求使用帮助信息,还必须有EDIT.HLP文件。若删除了QBASIC.EXE,则EDIT将无法运行。
1.2.6 编辑源程序举例
假设下面的汇编语言源程序运行后能将以下BUF单元开始的10个存储单元清零,并在屏幕上显示出来。
NAME&& EXAM
DATA&& SEGMENT
BUF& &&DB 10 DUP(?),&$&
DATA &&ENDS
STACK &SEGMENT PARA STACK &STACK&
&&&&&& DB 100 DUP(?)
STACK &ENDS
CODE &&SEGMENT
&&&& &&ASSUME&& CS:CODE,DS:DATA,SS:STACK
START:MOV AX,DATA
&&&&& &MOV DS,AX
&&&& &&MOV BX,OFFSET BUF
&&&& &&MOV CL,0AH
LP:&& MOV BYTE PTR [BX],30H
&&&& &&INC BX
&&& &&&DEC CL
&&& &&&JNZ LP
&&&&& &MOV DX,OFFSET BUF
&&&&& &MOV AH,09H
&&&&& &INT 21H
&&&&& &MOV AH,4CH
&&&&& &INT 21H
CODE &&ENDS
&&&& &&END& START
现在用编辑程序EDIT将原程序输入到计算机中。首先键入:
C:/&EDIT?
屏幕显示版权信息。按ESC键进入编辑屏幕,与图1.2所不同的只是没有文件名。
光标停在第一行,第一列的位置。用键盘输入程序,一行结束按回车键,光标移到下一行,再继续输入,直到全部输入完毕。输入的程序显示如下:
DATA&& SEGMENT
BUF& &&DB 10 BUF (?),&$&
DATA &&ENDS
STACK &SEGMENT PARA STACK &STACK&
&&&&&& DB 100 DUP(?)
STACK &ENDS
CODE &&SEGMENT
&&&& ASUME&& CS:CODE,DS:DATA,SS:STACK
START:MOV AX,DATA
&&&&& &MOV DS,AX
&&&&& &MOV BX,OFFSET BUF
&&&&& &MOV CL,0AH
LP:&& MOVW [BX],30H
&&&&& &INC BX
&&&&& &DEC CL
&&&& &&JNZ LP
&&&&& &MOV DX,OFFSET BUF
&&&&& &MOV AH,09H
&&&&& &INT 21H
&&&&& &MOV AH,4CH
&&&&& &INT 21H
CODE &&ENDS
&&&& END& START
9ASSUMES16DEC BXEDIT&&ASUMESS;DEC BXCTRL+Y
ALTFILES***EEXAM.ASMFILEEXITEDIT
C/[]&MASM[][[][,[][[]]]][; ]([ ])
MASMCASMEXAM.ASMMASM
C/ASM&masm ?
Microsoft(R)Macro Assembler Version 5.00
Copyright(c)Microsoft Corp ,1987,All right reserved
Source filename[.ASM]:myfile ?
Object filename[EXAM.OBJ] ?
Source listing[NUL.LST] ?
Cross-reference[NUL.CRF] ?
Bytes symbol space free
&&&&&&&&& &&&&0 Warning Errors
&&&&&&&& &&&&&0 Severe Errors
宏汇编程序被调入以后,首先显示版本号。然后依次提出问题,请用户回答。
第一行提问被汇编的源文件的名字,方括号内表示此文件带有后缀.ASM(.ASM是该源程序文件的隐含扩展名),此时应键入将要汇编的源程序文件的名字,并按回车键。这里用的文件名是EXAM.ASM。
第二行提提问汇编后目标文件的名字,括号中的名字表示约定的文件名(其文件名部分自动采用源程序文件名),若采用这个名字则直接键入回车键。否则键入另起的名字。
第三行提问是否要建立列表文件。括号中的NUL为&空&的意思,表示不建立列表文件。若要建立列表文件,则需键入文件名,名字任选,也可与源程序文件名同名。但后缀必须为.LST,后缀可由用户连同文件名一起键入,也可不键入,即自动采用隐含值。如果不需要建立列表文件,则在第三行提问后直接按回车键。
第四行提问是否要建立交叉索引文件,括号中的意义同第三行,若不需要交叉索引文件,可直接按回车键,否则键入交叉索引文件名。
在各项提问一一回答之后,汇编程序才开始对源程序进行汇编。若源程序没有语法错误,则汇编成功,生成所要求的文件。
在回答提示信息时,可以使用以下两个命令字符:
(1);&&& :& 用于省略对后续提示的回答,仅取缺省值。
(2)CTRL+C: 当因为输入了错误的文件名或其他原因而想中途退出汇编程序时,按下CTRL+C键即可退出。
2) 命令方式
以命令方式使用汇编程序时,必须在MS-DOS下键入下列格式的命令:
MASM&源文件&,[&目标文件&],[&列表文件&],[&交叉参考文件&] ?
于是立即开始进行汇编。命令中MASM后面的项目,分别顺序对应于对话方式中对各提示信息的回答,各项目之间用逗号隔开。如果对某一提示信息采用缺省值,则只需在对应的位置连续输入两个逗号。例如:
MASM EXAM,,EXAM.LST,EXAM.CRF ?
1.3.2 汇编出错信息
汇编过程中,若发现源程序中有语法错误,则在显示器(也可以为打印机,取决于系统标准输出设备的设置)上列出有错误的语句和错误代码,并指出错误的类型,汇编完后列出警告性错误(Warning Error)和致命错误(Severe Error)的总数。若有致命性错误时,则汇编不成功,要根据汇编程序提示的错误信息分析错误原因,再用编辑程序进行修改,然后重新调用汇编程序进行修改。重复上述步骤,直至错误消除。通常警告性错误不影响目标文件的生成。
1.3.3 打印列表文件及交叉索引文件
若在汇编中要求生成列表文件或交叉索引文件,则在汇编后可以将它们打印出来。
打印出列表文件,可以了解汇编后的情况并做文件保留。
打印列表文件的方法为:
C:/ASM&TYPE&列表文件名&.LST?
打印出交叉索引文件,可以了解源程序中的符号定义和引用情况。
打印交叉索引文件的操作步骤为:
C:/ASM&CREF?
Cref filename[.CRF]:&交叉索引文件名&?
List filename[&交叉索引文件名&.REF]:?
C:/ASM&TYPE&交叉索引文件名&.REF?
在第1行提示下,打入汇编时在第4行询问时所键入的交叉索引文件名。
第2行提示,可直接回车,表示采用括号中的文件名。
第3行的TYPE命令就要打印出交叉索引的列表文件了。
1.3.4汇编操作举例
以1.2.6节编辑程序产生的汇编语言源程序EXAM.ASM为例说明汇编的过程。
EXAM.ASM可以在编辑状态中打印出来,也可以在DOS下用TYPE命令打印出来。
C:/ASM&MASM?
MICROSOFT(R)MACRO ASSEMBLER VERSION 5.00
COPYRIGHT(C) MICROSOFT CORP ,1987,ALL RIGHT RESERVED
SOURCE FILENAME[.ASM]:EXAM?
ODJECT FILENAME[EXAM.OBJ] ?
SOURCE LISTING[NUL.LST] ?
CROSS-REFERENCE[NUL.CRF] ?
EXAM.ASM(14):ERROR A2035:OPERAND MUST H***E SIZE
BYTES SYMBOL SPACE FREE
0 WARNING ERRORS
1 SEVERE ERRORS
汇编发现EXAM.ASM的第14行有错误,错误代码A2035,错误提示是&操作数必须有大小&。因为有致命性错误,所以汇编没有成功,没有产生目标文件。
检查源程序,第14 行是:
LP: MOV [BX],30H
操作数类型不明确,返回编辑状态,改为:
LP: MOV BYTE PTR[BX],30H
明确30H送BX所指的字节。程序为:
NAME &EXAM
DATA& &SEGMENT
BUF &&&DB 10 DUP(?),`$`
DATA &&ENDS
STACK &SEGMENTPARA STACK`STACK`
&&&&& &DB 100 DUP(?)
STACK &ENDS
CODE &&SEGMENT
&&&&&& ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AX,DATA
MOV DS,AX
&&&&&& MOV BX,OFFSET BUF
&&&&&& MOV CL,0AH
LP:&& MOV BYTE PTR[BX],30H
&&&&&& INC BX
&&&&&& DEC CL
&&&&&& JNZ LP
MOV DX,OFFSET BUF
MOV AH,09H
MOV AH,4CH
CODE &&ENDS
&&&& &&END START
重新汇编这个程序,并生成列表文件和交叉列表文件。
C:/ASM&MASM?
MICROSOFT(R)MACRO ASSEMBLER VERSION 5.00
MCOPYRIGHT(C) MICROSOFT CORP ,1987,ALL RIGHT RESERVED
SOURCE FILENAME[.ASM]:EXAM?
ODJECT FILENAME[EXAM.OBJ] ?
SOURCE LISTING[NUL.LST] ?
CROSS-REFERENCE[NUL.CRF] ?
BYTES SYMBOL SPACE FREE
0 WARNING ERRORS
0 SEVERE ERRORS
2)输出列表文件
C:/ASM&TYPE EXAM.LST?
MICROSOFT(R)MACRO ASSEMBLER VERSION 5.00&&&&&&&&& 6/20/00
1&&&&&&&&&&&NAME EXAM
2& A[&& &&&&&&&DATA &&&&SEGMENT
3& 0000&&& ??&&& &&&&&&BUF &&&&&DB 0A DUP(?),`$`
4&&&& &&&&&&&&&]
7& 000A&&&&&&&& &&&&&&&DATA &&&&ENDS
8& 0000&&&&&&&&&& &&&&&STACK&& &SEGMENT PARA STACK`STACK`
9& 0000& 0064[&& &&&&&&DB&&& &&&100 DUP(?)
10 0000&& ??
11&& &&&&&&&&&&]
13& 0064&&&&&&&&&&&&&& SEACK&&& ENDS
14& 0000&&&&&&&&&&&&&& CODE&&&& SEGMENT
15&&&&&&&&&&&&&&&&&&&& ASSUME& &CS:CODE,DS:DATA,SS:STACK
16& 0000& B8...... R& &START:& MOV AX,DATA
17& 0000& 8E D8&&&&&&&&&&&&& &&&MOV DS,AX
18& 0005& BB 0000& R&&&&&&&& &&&MOV BX,OFFSET BUF
19& 0008& B1 0A&&&&&&&&&&&&& &&&MOV CL,0AH
20& 000A& C6 07 30&&&&&& &LP: &MOV [BX],30H
21& 000D& 43&&&&&&&&&&&&&&&& &&&INC BX
22& 000E& FE C9&&&&&&&&&&&& &&&&DEC CL
23& 0010& 75 F8&&&&&&&&&&&& &&&&JNZ LP
24 &0012& BA 0000& R&&& &&&&&&&&MOV DX,OFFSET BUF
25 &0015& B4 09&&&&&&&&& &&&&&&&MOV AH,09H
26& 0017& CD 21&&&&&&&&&&&& &&&&INT 21H
27& 0019& B4 4C&&&&&&&&&&&& &&&&MOV AH,4CH
28& 001B& CD 21&&&&&&&&&&&& &&&&INT 21H
29& 001D&&&&& &&&&&&&&&&CODE &&&ENDS
30&&&&&&&&&&&&&&&&&&&&&&&&&& &&&END START
MICROSOFT(R)MACRO ASSEMBLER VERSION 5.00&&&&&&&&& 6/20/00
Segmments and Group
&& Name&&&&&&&&&&&&&&&&&& Length Align Combine Class
Code&&&&&&&&&&&& &&&&&&&&&001D PARA NONE
Data&&&&&&&&&& &&&&&&&&&&&000A PARA NONE
Stack&&&&&&&&&& &&&&&&&&&&0064 PARA NONE STACK
&&&&& Name&&&&&&&&&& &&&&&Type Value Attr
BUF&&&&&&&&& &&&&&&&&&&&&&L BYTE 0000DATA LENGTH=000A
LP&&&&&&&&& &&&&&&&&&&&&&&L NEAR 000A CODE
START&&&&& &&&&&&&&&&&&&&&L NEAR 0000 CODE
@FILENAME&&&& &&&&&&&&&&&&TEXT EXAM
24Soutce Lines
25Total Lines
Bytes symbol space free
0 Warning Errors
0 Severe& Errors
MICROSOFT(R)& CROSS-REFERENCE UTILITY YERSION 5.00
COPYRIGHT (C) MICROSOFTCR CROP 1981----19851987.ALL RIGHTS RESEREVD
CROSS-REFERENCE [.CRF]EXAM?
LISTING [EXAM.REF]?
6 &SYMBOLS
C/&TYPE EXAM.REF
MICROSOFT CROSS-REFERENCE VERSION 5.00 Thu Jun 20 154443 2000
SYMBOL CROSS-REFERENCE (#DEFINTION+MODIFICATION) CREF-1
BUF&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&3#&& 18&& 24
CODE&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&14#&& 15& &29
DATA&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&2#&& 7&& &15&& 16
LP&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&20#&& 23
STACK&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&8#&& 8&&& 13&& 15
STACK&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&16#&& 30
6&& Symbols&&&&&
(MASM)(.OBJ)()LINKLINK.EXEDOS.MAPLINK
C/[]&LINK [][[][[][[]]]][; ]([ ])
DOSLINK?(或LINK[选项]),调入连接程序屏幕显示有关信息,提示用户逐行回答。
C:/ASM &LINK ?
MICROSOFT (R)& OVERLAY LINKER& VERSION 3.60
COPYRIGHT (C) MICROSOFT CORP . ALL& RIGHTS &RESERVED
OBJECT MODULES[.OBJ]:EXAM ?
RUN FILE [EXAM.EXE]: ?
LIST& FILE [NULL.MAP]: ?
LIBRARIES [.LIB]: ?
第1行提示要求输入目标模块名。此时应键入要连接的目标文件名(后缀.OBJ可省略,LINK程序自动加上.OBJ为后缀)。若连接的是多个目标模块,需用+号或空格将各文件名隔开,如果一行放不下,就在该行的最后输入一个+号,然后按回车键,连接程序就提示用户追加目标文件。全部输入完毕后回车。
第2行提示要求输入将要生成的可执行文件的文件名,括号内为LINK程序给出的隐含文件名,它与第1行提示中的目标模块名一致,只是将后缀.EXE1
3()LINK.MAP
LINK(.OBJ)(.EXE)DOS
C/ASM&EXAM?
在执行程序后可以看到执行结果,是因为源程序中有显示结果的指令,有的程序如果没有显示结果指令,要想看到结果,可以通过DEBUG调试程序来达到目的。
汇编语言经过编译,连接后生成目标代码。当运行目标代码时,可能出现错误的结果,如果直接查找错误就比较麻烦。DEBUG是一个专门为调试汇编语言程序而设置的工具,它可以检查和修改存储器及寄存器的内容,装入或启动运行程序,它还可以用来直接汇编简单的汇编语言程序,为用户提供了极大的方便。
当然在DEBUG状态下运行汇编程序也具有一定局限性:
①在DEBUG状态下运行程序不能使用宏汇编程序中的宏指令,大部分伪指令也不能使用,只能调试其程序段。
②不能调试太长的程序,只能分块进行程序设计。
③在DEBUG状态下调试好的程序不能形成以DOS外部命令形式构成的 .EXE文件,因此调试好的程序只能记下,到编辑环境下重新键入调试好的程序,通过汇编程序,连接程序形成可执行文件 .EXE。
1.5.1 DEBUG 的调用
1) DEBUG 的启动
DEBUG的启动格式如下
(2) DEBUG[&路径名&][&参数&]
这里的路径名是指被调试程序的路径,而参数是包括在被调试程序名中的各参数。例如
C:/ASM&DEBUG EXAM.EXE?
此命令把DEBUG程序调入内存后,DEBUG程序又把调试的程序调入内存中。若是启动格式(1),则DEBUG程序是以当前内存的内容工作。
在DEBUG成功地调入内存后,将显示提示符&-&,说明系统现在是在DEBUG程序管理之下。DEBUG所属的命令,只有出现DEBUG提示符后才能有效。
2)寄存器和标志位的初始化
进入DEBUG后,各寄存器和标志位被初始化,其值可用寄存器显示命令查看。例如:在用第一种格式启动DEBUG后
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=16AD ES=16AD SS=16C0 CS=168C IP=0000 NV UP EI PL NZ NA PO NC
168C:0100& B8368021&&& MOV&&& SI,[2180]
在用第二种格式启动DEBUG后
AX=0000 BX=0000 CX=002D DX=0000 SP=0064 BP=0000 SI=0000 DI=0000
DS=16BD ES=16AD SS=16C0 CS=16BE IP=0000 NV UP EI PL NZ NA PO NC
16BE:0000&& B8BD16&&&& MOV&&& AX,16BD
比较它们的结果可知:
① 段寄存器CS,DS,ES和SS被置于自由存储空间的底部,但不同机器,不同环境,其值不同。
② 寄存器AX,DX,BP,SI和DI置为0,BX和CX视具体情况而定。当启动DEBUG过程中包含了文件标识符时,则BX和CX的内容代表装入被调试程序的文件大小,如被调试的程序文件小于64K,则CX值为代表文件的字节数,如大于64K,则除CX外,和BX一起代表被调试的程序字节数(高位部分在BX中)。如启动时不包含文件标识符,则BX,CX为0。
③ IP和SP的值不同。
④ 各标志位如R命令的显示结果。
1.5.2 DEBUG 的主要命令
1) DEBUG命令的有关规定
①DEBUG命令都是一个英文字母,后面跟着一个或多个有关参数,多个操作参数之间用&,&或空格隔开。
②DEBUG命令必须接着按ENTER键,命令才有效。
③参数中不论是地址还是数据,均用十六进制数表示,但十六进制数据后面不要用&H&。
④可以用CTRL+BREAK键来停上个命令的执行,返回到DEBUG的提示符&-&下。
⑤用CTRL+Num LOCK键中止正在上卷的输出行,再通过按任意键继续输出信息。
2) DEBUG命令
(1) 汇编命令A
格式:a. A[段寄存器名]:[偏移地址]
&&& &&b. A[段地址]:[偏移地址]
&&&& &c. A[偏移地址]
&&&& &d. A
功能:用该命令可将汇编语言程序直接汇编进入内存。当键入A命令后,显示段地址和偏移地址等待用户键入下一条汇编指令,每键入一条汇编指令回车后,自动显示下一条指令的段地址和偏移地址,再键入下一条汇编指令,直到汇编语言程序全部键入,又显示下一条地址时,可直接键入回车返回到提示符&-&为止。
若输入语句有错误,DEBUG就显示:
且重新显示现行的汇编地址,等待新的输入。
其中a的段地址在段地址寄存器中,因此使用该命令时必须将段地址寄存器送入段地址,c的段地址在CS中,d的段地址在DS中,偏移地址为0100H。
汇编命令的主要优点是可以对部分程序进行汇编,然后进行和调试,这比放在整个程序中调试要简单便得多。
168C:0010& MOV DX,[10AA]
168C:0014& MOV AX,DX
168C:0016& AND AX,000F
168C:0019
从CS:10开始,输入3条指令语句,将其汇编后,目标代码存入原地址。
在地址后直接回车键,则返回DEBUG。
在输入汇编语言语句时,应注意以下语法规则:
① 输入数值,全为16进制数,可以输入1-4个数字节字符。
② 段超越助记符为CS: ,DS: ,ES: 和SS: 。
③ A命令能自动汇编短、近、远程的转移和调用。这取决于到达目的地址的字节偏移量。可以用NEAR和FAR前缀来超越。
0100:0500& JMP 520&&&& &;两字节短转移指令
0100:0502& JMP NEAR 505 ;三字节近转移指令
0100:0505& JMP FAR 50A &;五字节远转移指令
④ DEBUG不能区别操作数究竟是立即数还是存储单元地址,所以必须把存储单元地址放在方括弧里来加以区别。
⑤ 两个最常用的伪指令DB和DW也可以使用,用来直接将字节和字的值送入相应的存储单元中。
(2) 显示内存命令D
格式:a. D[地址]
&&&& &&&&&b. D[地址范围]
&&& &&&&&&c. D
功能:显示指定内存范围的内容
显示内存内容三部分:左边是地址部分,表示此行的首地址(段:偏移量);中间是存储器内容的以16进制数表示部分,以两位16进制数字表示一存储单元内容;右边是存储器内容的ASCII码部分,各字节以ASCII字符形式显示,不可显示的字符以圆点(. )表示。
例1命令中指定了地址,则从指定地址开始,显示40H(128)字节。
168C:0050 &&CD 21 CB 00 00 00 00 00-00 00 00 00 00 20 20 20&& &&.!............
168C:0060 &&20 20 20 20 20 20 20 20-00 00 00 00 00 20 20 20&& &&&&&&&&&&&.....
168C:0070 &&20 20 20 20 20 20 20 20-00 00 00 00 00 00 00 00&& &&&&&&&&........
168C:0080 &&00 0D 65 78 61 6D 2E 65-78 65 00 00 00 00 00 00&& ..exam.exe......
168C:0090 &&00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00&& ................
168C:00A0 &&00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00&& ................
168C:00B0 &&00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00&& ................
168C:00C0 &&00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00&& ................
例2& 命令中指定了地址范围,则显示该范围内内存单元的内容。
在范围中包含起始地址和结束地址。若输入的起始地址中,未含段地址部分,则D命令认为段地址在DS中。输入的结束地址中只允许有偏移量。
-d& cs:10 1f?
168C:0010& &&11 10 17 03 11 10 3C 0E-01 01 01 00 02 FF FF FF&& ......&..........
例3& 命令中没有指定地址,则从上一个D命令所显示的最后一个单元的下一个单元开始,显示80H(128)字节。若以前没有使用过D命令,则从DEBUG初始化时的段和偏移量的地址开始。
168C:0100&& 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00&& ................
168C:0110&& 4D 00 00 0E 00 89 55 14-C6 45 1F 00 34 00 78 16 &&M....U..E..4.{.
168C:0120&& 54 4D 50 3D 43 3A 5C 57-49 4E 44 4F 57 49 4E 44&& TMP=C:/WINDOWS/T
168C:0130&& 45 4D 50 00 54 45 4D 50-3D 43 3A 5C 57 49 4E 44&& EMP.TEMP=C:/WIND
168C:0140&& 4F 57 53 5C 54 45 4D 50-00 50 52 4F 4D 50 54 3D&& PWS/TEMP.PROMPT=
168C:0150&& 24 70 24 67 00 77 69 6E-62 6F 6F 74 64 69 72 3D&& $p$g.winbotdir=
168C:0160&& 43 3A 5C 47 49 4E 44 4F-57 53 00 50 41 54 48 3D&& C:/WINDOWS.PATH=
168C:0160&& 43 3A 5C 47 49 4E 44 4F-57 53 3B 43 3A 5C 57 49&& C:/WINSOWS;C:/WI
(3) 修改存储单元内容命令E
格式:a.E[地址][内容表]
&&&& &b.E[地址]
功能:a.用命令所给定的内容表去代替指定地址范围的内存单元内容。
&&&& &b.一个单元一个单元地连续修改单元内容。
其中:内容表为一个十六进制或一串十六进制数,也可以是用单引号括起的一串字符。
例1&用命令中给定的内容表替换指定范围内存单元内容。
-e& cs:e2 &a&& b&&& c&&& d&&& e&&& f?
-d& cs:e0& ef?
168C:00E0 00 00 0A 0B 0C 0D 0E 0F-00 00 00 00 00 00 00 00&&& ................
&&& CS:E2& 开始的6个单元呢荣改成A、B、C、D、E、F。
例2 用格式b,屏幕上显示指定单元的地址和内容,用下面的操作方法,逐个单元进行修改。
①输入一个字节16进制数后,按空格键,以代替原单元中的内容。然后再显示下一单元的地址和内容。若还要修改的话,则输入一个字节16进制数,再按空格键&&这样就可以连续不断地修改。
②若某一单元的内容不需要修改,而操作又要往下进行,则可直接空格键。
③输入一个连接号(-),则显示前一单元地址和内容,若要修改的话,则输入新值,然后再按(-),这样就可以实现反向逐步修改。
若显示的前一个单元的内容不需要修改,可直接按(-)键。
④按Enter键,以结束E命令返回DEBUG。
168C:00E2 &&0a.01 0b.02 0c.03 0d.04& 0e.05& 0f.06
-d& cs:20& 2f?
10FA:0020 &&00 00 01 02 03 04 05 06-00 00 00 00 00 00 00 00 ................
将例1修改的内容又修改为1,2,3,4,5,6。
检查和修改寄存器内容命令R
格式:a. R
&&& &&b. R& [寄存器]
&&&& &c. R& F
功能:a. 显示CPU内部所有寄存器的内容和全部标志位的状态。
b. 显示和修改一个指定寄存器的内容。
c. 显示和修改标志位的状态。
例1 显示所有16位寄存器的内容,以及用字母表示标志位状态和将要执行的下条指令。
AX=0000 BX=0000 CX=002D DX=0000 SP=0064 BP=0000 SI=0000 DI=0000
DS=16AD ES=16AD SS=16C0 CS=16BE IP=0000 NV UP EI PL NZ NA PO NC
16BE:0000& B8BE16&& MOV AX,16BD
前两行显示各16位寄存器内容和双字母表示的标志位状态。最后一行批示将要执行的下条指令的地址和指令码及其反汇编格式。这是由CS:IP批示的指令。
例2显示单个16位寄存器内容,并可进行修改。
则屏幕显示:
如不需要修改,则按Enter键。如果修改,则在冒(:)后输入两个字节的16进制数,再按Enetr健。
将寄存器CX内容从002D改为00FF,又改回002D。
例3 显示8个标志位状态,并可修改其中之一或全部。
则屏幕显示:
NV UP EI PL NZ NA PO NC &
若不需要修改任何标志位,则直接按Enter键。若需要修改标志,则可输入标志的相反值,且与输入标志的顺序无关,标志间也可不用空格,最后按Enter键。
NV UP EI PL NZ NA PO NC &di OV
OV UP DI PL NZ NA PO NC &ei NV
NV UP EI PL NZ NA PO NC &
标志位NV、EI改为OV、DI,后又改为NV、EI。
表1.3给出了各标志位置位、复位状况。
(5) 反汇编命令U
格式:a. U[地址]
&&&&& b. U[地址范围]
功能:将指定范围内的代码以汇编语言形式显示,同时显示该代码位于内存的地址和机器码。
表1.3& 标志位
若命令中没有指定地址则以前一个U命令反汇编最后一条指令的后面一个单元为起始地址。若先前没有使用过U 命令,则开始地址以DEBUG初始化段寄存器的值作为段地址,0100H作为偏移地址。
将前面用A命令汇编过的3条语句再反汇编回来。
168C:0010&& &8B16AA10 &&&MOV DX[10AA]
168C:0014 &&&8900&&&& &&&MOV AX,DX
168C:0016 &&&250F00&& &&&AND AX,000F
反汇编字节数取决于系统显示格式及反汇编命令的选择方式。一般,反汇编和显示的字节数可能比要求的或默认的数量要多一些,这是因为各指令有不同的长度,为了对最后一条指令反汇编,就可能包括比要求多一点的字节。类似原因,要保证命令中的起始地址必须是指令码的首字节,否则反汇编会出错。
若只输入偏移量作为起始地址,则隐含CS作为段寄存器。
(6) 追踪与显示命令T
格式:a. T[=地址]或T[地址]
&&&&& b. T[=地址][条数]或T[地址][条数]
功能:a. 执行一条指定地址处的指令,停下来,显示CPU所有寄存器内容和全部标志位的状态,以及下一条指令的地址和内容。
b. 为多条跟踪命令,从指定地址开始,若命令中用[地址]给定了起始地址,则从起始地址开始:若未给定,则从当前地址(CS:IP)开始,执行命令中的[条数]决定一共跟踪几条指令后返回DEBUG状态。
例1 按单条指令跟踪。
AX=168D BX=0000 CX=002D DX=0000 SP=0064 BP=0000 SI=0000 DI=0000
DS=16AD ES=16AD SS=17C0 CS=16BE IP=0003 NV UP EI PL NZ NA PO NC
16BE:0003 &&8ED8 &&MOV DS,AX
AX=16BD BX=0000 CX=002D DX=0000 SP=0062 BP=0000 SI=0000 DI=0000
DS=16BD ES=16AD SS=16C0 CS=16BE IP=0005 NV UP EI PL NZ NA PO NC
16BE:0005 &&BB0000& &MOV BX,0000
例2按多条指令跟踪
由跟踪命令产生连续显示,一直执行到Value条指令为止。因此,在执行多条跟踪指令时,可以在任何时候按Ctrl-Numlock或pause暂停显示滚动。当需要继续跟踪显示时,再按任一其他字符键又可快速显示滚动。
-t=03&& 5?
AX=16BD BX=0000 CX=002D DX=0000 SP=0062 BP=0000 SI=0000 DI=0000
DS=16BD ES=16AD SS=16C0 CS=16BE IP=0005 NV UP EI PL NZ NA PO NC
16BE:0005 &&BB0000& &MOV BX,0000
AX=16BD BX=0000 CX=002D DX=0000 SP=0062 BP=0000 SI=0000 DI=0000
DS=168E ES=16AD SS=16C0 CS=16BE IP=0008 NV UP EI PL NZ NA PO NC
16BE:0005 &&B10A&& &MOV CL,0A
AX=16BD BX=0000 CX=000A DX=0000 SP=0062 BP=0000 SI=0000 DI=0000
DS=168E ES=16AD SS=16C0 CS=16BE IP=000A NV UP EI PL NZ NA PO NC
16BE:000A &&C60730&& &MOV BYTE PTR[BX],30&&&& DS:0000=00
AX=16BD BX=0000 CX=000A DX=0000 SP=0062 BP=0000 SI=0000 DI=0000
DS=168E ES=16AD SS=16C0 CS=16BE IP=000D NV UP EI PL NZ NA PO NC
16BE:000D &&43&& &INC&& BX
AX=16BD BX=0000 CX=002D DX=0000 SP=0062 BP=0000 SI=0000 DI=0000
DS=168E ES=16AD SS=16C0 CS=16BE IP=000E NV UP EI PL NZ NA PO NC
16BE:000E &&FEC9&& DEC& CL
T命令用于程序调试,能跟踪程序执行情况,迅速找出错误原因。
(7) 运行命令G
格式:G[=地址][地址][地址&]
功能:执行用户正在调试的程序。
其中:地址为执行起始地址,以CS中内容作为段地址,以等号后面的地址为偏移地址,再后面的地址为断点地址。在命令行中只有起始地址,没有断点地址,则程序在执行时不中断。
例1 没有断点的运行。
Program terminated normally
Program terminated normally
当每次用不同的地址去检查程序的执行情况时,这种选择是很有用的。如果不使用[=地址]参数,则在发出G命令之前,必须将CS:IP的值先设置正确。
当程序执行完毕,DEBUG显示信息&program terminated normally&(程序正常结束)。若还要执行此程序,则必须重新将程序输入。
命令中的地址参数所指的单元,要保证包含有效的指令码,若指定的地址单元不包含有效指令的第一个字节,将会产生死机现象。
例2 设置断点的运行。
AX=0000 BX=0000 CX=000A DX=0000 SP=0064 BP=0000 SI=0000 DI=0000
DS=0000 ES=16AD SS=16C0 CS=16BE IP=000D NV UP EI PL NZ NA PO NC
16BE:000D &&&43 &&INC&& &BX
在CS:0D处设了断点,程序运行到此停止。
在调试程序时,往往要设置断点。DEBUG程序允许最多设置10个断点,这些断点地址的次序是任意的。设置多断点的目的是:可以逐段地检查程序的执行,特别是程序为多分支时,则不管程序走哪个分支,均可在分支中的断点处停止执行,以检查程序是否正确。
DEBUG程序的断点设置是用一个中断类型3指令(操作码为CCH)来代替被调试程序在断点地址处的操作码。当程序执行到一个断点地址时,就停下来,显示CPU各寄存器的内容和各标志位状态,以及下一条要执行的指令:且被调试程序的所有断点处的指令码都被除数恢复,全部断点被取消,并返回DEBUG。
若输入的断点地址只包含地址的偏移量,则G命令认为其段地址隐含在段寄存器CS中。
(8)命名命令N
格式:N文件名
功能:在调用DEBUG时,没有文件名,则需要用N命令将要调用的文件名格式化到CS:5CH的文件控制块中,才能用L命令把它调入内存进行调试。
例如:用N命令,调入EXAM.EXE文件。
C:/ASM&DEBUG?
-N EXAM.EXE?
(9)读盘命令L
格式:a. L[地址][驱动器号][起始扇区号][所读扇区个数]
&&&& &b. L[地址]
&&&& &c. L
功能:a.把指定驱动器和指定扇区范围的内容读支指定内在的连续单元中。其中地址是读入内在的起始地址,地址缺省值为CS:100H。起始扇区号指逻辑区号的起始位置。所读扇区个数是指从起始扇区号开始读到内在几个扇区的内容,驱动器号为0或1,0表示A盘,1表示B盘。
&&&& &b.读入已在CS:5CH中格式化的文件控制块指定的文件。在使用该命令前用N命令命名即可,将要读入的文件名格式化到CS:5CH的文件控制中,其中地址为内存地址。
&&& &&c.同b,地址隐含在CS:100H中。当读入的文件有扩展名.COM或.EXE,则始终装入CS:100H中,命令中即使指定了地址也不起作用。
其中:BX和CX中存放所读文件的字节数。
(10)写盘命令W
格式:a. W[地址][驱动器号][起始扇区号][所写扇区个数]
&&&&& b. W[地址]
&&&&& c. W
功能:a. 把在DEBUG状态下调试的程序或数据写入指定的驱动器中,起始扇区号为逻辑区号,所写扇区个数为要占盘中几个扇区。
写盘指定扇区的操作应十分小心,如有差错将会破坏盘上原有的内容。
如果在命令行中的地址只包含偏移地址,W命令认为段地址在CS中。
&&&& &b. 当键入不带参数的写盘命令时(或只键入地址参数的写盘命令),写盘命令把文件写到软盘上。该文件在用W命令之前用命令N将文件格式化在CS:5CH的文件控制块中。
&&&& &c. 只有W命令而没有任何参数时,与N配合使用进行写盘操作。
在用W命令以前在BX或CX中应写入文件的字节数。
(11) 结束DEBUG返回DOS命令Q。
功能:程序调试完退出DEBUG状态,返回到DOS状态下。
Q命令不能把内存的文件存盘,要想存盘必须在退出DEBUG之前用W命令写盘。
第二章 汇编语言程序实训
实训一& 顺序程序设计
(1)掌握顺序程序设计方法。
(2)学习数据传送及算术和逻辑运算指令的用法。
(3)熟悉在PC机上建立、汇编、连接、调试和运行8086汇编程序的过程。
(1)有一字变量BUF1是以原码表示的有符号数,要求将其转换为反码和补码,分别存入BUF2各BUF3单元,并在屏幕上显示出来。
(2)有两个两字节无符号数分别在存储单元A、B起始的缓冲器中,求其和,结果放在A起始的缓冲区并在屏幕上显示。相加若有进位不存入存储单元。
PC机一台。
(1)分析题目,将程序中的原始数据和最终结果的存取方法确定好。
(2)画出流程图。
(3)写出源程序。
(4)对程序中的结果进行分析,并准备好上的调试与汇编程序及汇编调试的过程。
(1)输入源程序。
(2)汇编、连接程序,生成。EXE文件,执行文件,检查结果。
(1)列出源程序,说明程序的基本结构,包括程序中各部分的功能。
(2)说明程序中各部分所用的算法。
(3)说明主要符号和所用到寄存器的功能。
(4)上机调试过程中遇到的问题是如何解决的。
(5)对调试源程序的结果进行分析。
实训二&& 循环程序设计
(1)加深对循环结构的理解。
(2)掌握循环程序的设计方法。
(3)熟练掌握DEBUG的常用命令,学会以用DEBUG调试程序员。
(1)编制程序计算S=1+2*3+3*4+4*5+&&+N(N+1)+&&直到N(N+1)大于200为止,并使结果显示在屏幕上。其程序的逻辑框图如图所示。
(2)将从3000H内存单元开始的100个字节存储单元全部清零。
本实训要求在DEBUG调试状态下进行,包括汇编程序、运行程序、检查结果。
实训内容一:
(1)按程序流程图编制实训程序。
(2)输入源程序。
(3)汇编、连接程序,执行程序,检查结果。
实训内容二:
(1)输入源程序并检查无误。
(2)对内存单元3000H开始的100个存储单元用E命令输入任意数。
(3)程序的执行可用DEBUG的G命令,也可用T命令单步跟踪执行。
(4)用D命令检查执行结果。
(1)列出源程序。
(2)对程序中用到的寄存器说明其功能。
(3)总结计数控制循环程序的设计方法。
(4)说明使用DEBUG进行程序调试的方法,调试过程中所遇到的问题是如何解决的。
实训三& 分支程序设计
(1)掌握分支程序的结构。
(2)掌握分支程序的设计、调试方法。
(1)在BUP和BUP+1、BUP+2单元分别放有一个无符号字节型数,编程序将其中最大数存入MAX单元,并在屏幕上显示。
(2)要求同上,只是比较的数为有符号数。
(3)将1000H单元开始的10个字节数采用奇偶校验,将奇数在前偶数在后仍存回原数据区,本实训要求在DEBUG调试状态下进行,包括汇编程序、运行程序、检查结果。
(1)阅读教材中有关分支程序的内容。
(2)按要求编写程序。
(3)对照实训步骤,将要测的数据事先画好表格。
(1)输入源程序
(2)汇编、连接程序,生成。EXE文件,执行文件检查结果。
(3)对于实训内容三,进入DEBUG后,先用A命令汇编程序,同时用E命令对1000H开始的单元置10个字节数,然后对程序进行调试,用T命令观察程序流程。程序运行完毕用D命令检查1000H开始的10个单元的内容。
(1)列出源程序
(2)将实训测得的数据与理论分析比较。
(3)总结为什么在设计分支程序时必须解决三个问题判断、转向各定标号。
(4)说明标志位CF,SF和OF的意义。
实训四&&& 子程序设计
(1)学习子程序的定义和调用方法。
(2)掌握子程序、子程序的嵌套、递归子程序的结构。
(3)掌握子程序设计、编制及调试。
设有五个字数据存放在以BUP为首地址的内存单元中,要求采用调用多个字数据相加的子程序方法编程,和的低位字放在RESULT单元,和的高位字放在RESULT+2单元,并将结果显示在屏幕上。
(1)阅读教材中有关的内容,按要求编写程序。
(2)熟悉字符显示程序段的编写。
(3)对照实训步骤,将要测的数据画好表格。
PC机一台。
一、实训步骤
(1)编辑、汇编、连接程序,生成。EXE文件。
(2)进入DEBUG,对程序进行调试。
?在以BUF为起始地址的存储区中置入数据。
?调试运行程序,记录RESULT和RESULT+2单元的内容。
(1)列出源程序。
(2)通过实训说明PUSH指令和POP指令的功能及先进后出的工作原理。说明子程序开始用PUSH指令保护现场,执行完子程序主体后用POP指令恢复现场的必要性。
(3)说明主程序和了程序在程序形式上有何异同
实训五&& 显示程序设计
(1)掌握软件延时程序的编写方法。
(2)熟悉系统功能调用的方法。
(3)掌握宏定义与宏调用的方法。
(1)在CRT上每隔一秒连续显示字符0-9。
编程提示:
为了使输出的字符之间有空格,在每一个循环中输出一个0-9的字符和一个空格。为了输出0-9,置寄存器BL初值为0,每循环一次使其增量。为了保证输出是十进制,增量后用DAA调整指令。由于输出为一位十进制数,用AND 0FH指令屏蔽高4位。
(2)用系统功能调用将&HELLO&由键盘输入,再从屏幕输出&***HELLO***&。
PC机一台。
(1)输入源程序。
(2)编辑、汇编、连接程序,生成。EXE文件,执行文件检查结果。
(3)改变延时时间,观察显示速度。
(1)列出源程序。
(2)总结软件延时程序的编写方法。
(3)总结常用系统调用的功能及调用方法。
实训参考程序:
实训1 EXAM1-1
& DATA&&& SEGMENT
& BUF1&&& DW& 9348H
& BUF2&&& DW& 4DUP(0),0AH,0DH,&$&
& BUF3&&& DW& 4DUP(0), &$&
& DATA&&& ENDS
& CODE&&& SEGMENT
&&&&&&&&& ASSUME& CS:CODE,DS:DATA
& BEGIN: MOV AX,DATA
&&&&&&&& MOV DS,AX
&&&&&&&& MOV AX,BUF1
&&&&&&&& ADD AX,0
&&&&&&&& JS& NEXT
&&&&&&&& MOV BUF2,AX
&&&&&&&& MOV BUF3,AX
&&&&&&&& JMP EEE
& NEXT:& AND AX,7FFFH
&&&&&&&& NOT AX
&&&&&&&& MOV BUF2,AX
&&&&&&&& INC AX
&&&&&&&& MOV BUF3,AX
& EEE:&& MOV CX,0004H
&&&&&&&& MOV DI,OFFSET BUF2
&&&&&&&& MOV DX,[DI]
&&&&&&&& ADD DI,03
& BBB:&& MOV AX,DX
&&&&&&& &AND AX,000FH
&&&&&&&& CMP AL,0AH
&&&&&&&& JB& QQQ
&&&&&&&& ADD AL,07H
& QQQ:&& ADD AL,30H
&&&&&&&& MOV [DI],AL
&&&&&&&& DEC DI
&&&&&&&& PUSH CX
&&&&&&&& MOV CL,04H
&&&&&&&& SHR DX,CL
&&&&&&&& POP CX
&&&&&&&& LOOP BBB
&&&&&&&& MOV CX,0004H
&&&&&&&& MOV SI,OFFSET BUF3
&&&&&&&& MOV DX,[SI]
&&&&&&&& ADD SI,03H
& CCC:&& MOV AX,DX
&&&&&&&& AND AX,000FH
&&&&&&&& CMP AL,0AH
&&&&&&&& JB DDD
&&&&&&&& ADD AL,07H
& DDD:&& ADD AL,30H
&&&&&&&& MOV [SI],AL
&&&&&&&& DEC SI
&&&&&&&& PUSH CX
&&&&&&&& MOV CL,04H
&&&&&&&& SHR DX,CL
&&&&&&&& POP CX
&&&&&&&& LOOP CCC
&&&&&&&& MOV DX,OFFSET BUF2
&&&&&&&& MOV AH,09H
&&&&&&&& INT 21H
&&&&&&&& MOV DX,OFFSET BUF3
&&&&&&&& MOV AH,09H
&&&&&&&& INT 21H
&&&&&&&& MOV AH,4CH
&&&&&&&& INT 21H
& CODE&& ENDS
&&&&&&&& END BEGIN
执行程序EXAM1-1。EXE,屏幕上显示结果:
实训1& EXAM1-2
DATA& SEGMENT
A&&& DB& 34H,18H,2DUP(0),&$&
B&&& DB& 56H,83H
CODE SEGMENT
&&&& ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
&&&&& MOV DS,AX
&&&&& MOV AL,A
&&&&& MOV BL,B
&&&&& ADD AL,BL
&&&&& MOV AH,A+1
&&&&& MOV BH,B+1
&&&&& ADC AH,BH
&&&&& MOV A,AL
&&&&& MOV A+1,AH
&&&&& MOV CX,0004H
&&&&& MOV DI,OFFSET A
&&&&& MOV DX,[DI]
&&&&& ADD DI,03
NEXT: MOV AX,DX
&&&&& AND AX,000FH
&&&&& CMP AL,0AH
&&&&& JB QQQ
&&&&& ADD AL,07H
QQQ:& ADD AL,30H
&&&&& MOV [DI],AL
&&&&& DEC DI
&&&&& PUSH CX
&&&&& MOV CL,04
&&&&& SHR DX,CL
&&&&& POP CX
&&&&& LOOP NEXT
&&&&& MOV DX,OFFSET A
&&&&& MOV AH,09H
&&&&& INT 21H
&&&&& MOV AH,4CH
&&&&& INT 21H
CODE&&&&& ENDS
&&&&&& END START
执行程序EXAM1-2。EXE,屏幕上显示结果:
实训2& EXAM2-1
DATA SEGMENT
BUF& DB&S=1+2*3+3*4+4*5+。。。。。。+N(N+1)+。。。=&,&$&
RES DW 4 DUP(0),&$&
CODE SEGMENT
&&&& ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
&&&&& MOV DS,AX
&&&&& MOV DX,OFFSET BUF
&&&&& MOV AH,09H
&&&&& INT 21H
&&&&& MOV DX,1
&&&&& MOV BL,2
NEXT: MOV AL,BL
&&&&& INC BL
&&&&& MUL BL
&&&&& ADD DX,AX
&&&&& CMP AX,200
&&&&& JNA NEXT
&&&&& MOV CX,0004H
&&&&& MOV DI,OFFSET RES
&&&&& ADD DI,03H
NEXT1:MOV AX,DX
&&&&& AND AX,000FH
&&&&& CMP AL,0AH
&&&&& JB NEXT2
&&&&& ADD AL,07
NEXT2:ADD AL,30H
&&&&& MOV [DI],AL
&&&&& DEC DI
&& &&&PUSH CX
&&&&& MOV CL,04
&&&&& SHR DX,CL
&&&&& POP CX
&&&&& LOOP NEXT1
&&&&& MOV DX,OFFSET RES
&&&&& MOV AH,09H
&&&&& INT 21H
&&&&& MOV AH,4CH
&&&&& INT 21H
CODE& ENDS
&&&&& END START
执行程序EXAM2-1。EXE,屏幕上显示结果:
S=1+2*3+3*4+4*5+。。。。。。+N(N+1)+。。。=045F
2&& &EXAM2-2
2000 BF0030& MOV DI3000
&&& MOV CL64
2005 C60500& MOV BYTE PTR[DI]0
2008 47&&&&& INC DI
2009 FEC9&&& DEC CL
200B 75F8&&& JNZ 2005
200D F4&&&&& HLT
3&& EXAM3-1
STACK SEGMENT STACK
&&&&&& DB 1024 DUP(0)
STACK ENDS
DATA SEGMENT
BUF DB 70H35H1FH
MAX DB 2 DUP(?)$
CODE SEGMENT
&&&&& ASSUME CSCODEDSDATASSSTACK
BEGINMOV AXDATA
&&&&&& MOV DSAX
&&&&&& MOV ALBUF
&&&&&& CMP ALBUF+1
&&&&&& JNB LP1
&&&&&& MOV ALBUF+1
LP1&& CMP ALBUF+2
&&&&&& JMB LP2
&&&&&& MOV ALBUF+2
LP2&& MOV CX02H
&&&&&& MOV DIOFFSET MAX
&&&&&& MOV DLAL
&&&&&& INC DI
LP3&& AND AL0FH
&&&&&& CMP AL0AH
&&&&&& JB LP4
&&&&&& ADD AL07H
LP4&& ADD AL30H
&&&&&& MOV [DI]AL
&&&&&& DEC DI
&&&&&& PUSH CX
&&&&&& MOV CL04
&&&&&& SHR DLCL
&&&& &&POP CX
&&&&&& MOV ALDL
&&&&&& LOOP LP3
&&&&&& MOV DXOFFSET MAX
&&&&&& MOV AH09H
&&&&&& INT 21H
&&&&&& MOV AH4CH
&&&&&& INT 21H
CODE& ENDS
&&&&&& END BEGIN
执行程序EXAM3-1。EXE,屏幕上显示结果:
STACK& SEGMENT STACK
&&&&&&& DB& 1024 DUP(0)
STACK& ENDS
DATA&& SEGMENT
BUF&&& DB 98H75H32H
MAX&& DB 2 DUP(?)$
DATA& ENDS
CODE& SEGMENT
&&&&&&& ASSUME CSCODEDSDATASSSTACK
BEGIN MOV AXDATA
&&&&&& MOV DSAX
&&&&&& MOV ALBUF
&&&&&& CMP ALBUF+1
&&&&&& JG LP1
&&&&&& XCHG ALBUF+1
LP1&& CMP ALBUF+2
&&&&&& JG LP2
&&&&&& XCHG ALBUF+2
LP2&& MOV MAXAL
&&&&&& MOV CX02H
&&&&&& MOV DIOFFSET MAX
&&&&&& MOV DL[DI]
&&&&&& INC DI
LP3&& MOV ALDL
&&&&&& AND AL0FH
&&&&&& CMP AL0AH
&&&&&& JB LP4
&&&&&& ADD AL07H
LP4&& ADD AL30H
&&&&&& MOV [DI]AL
&&&&& &DEC DI
&&&&&& PUSH CX
&&&&&& MOV CL04
&&&&&& SHR DXCL
&&&&&& POP CX
&&&&&& LOOP LP3
&&&&&& MOV DXOFFSET MAX
&&&&&& MOV AH09H
&&&&&& INT 21H
&&&&&& MOV AH4CH
&&&&&& INT 21H
CODE& ENDS
&&&&&&& END BEGIN
执行程序EXAM3-2。EXE,屏幕上显示结果:
3&& EXAM3-3
2000 BE0010& MOV SI1000
2003 BF0910& MOV DI1009
&&& MOV DL[SI]
& ADD DL00
200B 7B0B&& JPO 2018
200D 8615&&& XCHG DL[DI]
200F 8814&&& MOV [SI]DL
2011 4F&&&&& DEC DI
2012 39FE&&& CMP SIDI
&&& JE 201D
2016 EBF0&&& JMP
2018 46&&&&& INC SI
&&& MOV DL[SI]
201B EBF5&& JMP 2012
201D F4&&&&& HLT
4& EXAM4-1
STACK SEGMENT STACK
&&&&&& DB 1024 DUP(0)
STACK ENDS
DATA SEGMENT
BUF& DW 0F101H110DH52H100H456H
COUNT =($-BUF)/2
RESULT DW 4 DUP(?)$
CODE SEGMENT
&&&&& ASSUME CSCODEDSDATASSSTACK
WDADD PROC
&&&&&&& PUSH DI
&&&&&&& MOV AX0
&&&&&&& MOV DX0
&&&&&&& MOV DIOFFSET BUF
NEXT2 ADD AX[DI]
&&&&&& JNC NEXT1
&&&&&& INC DX
NEXT1 ADD DI2
&&&&&& LOOP NEXT2
&&&&&& POP& DI
&&&&&& RET
&&&&& &WDADD ENDP
&&&&&& SHOW& PROC
&&&&&& PUSH&& CX
&&&&&& PUSH&& DI
&&&&&& MOV&& CX04H
&&&&&& MOV& DIOFFSET RESULT
&&&&&& MOV& BXAX
&&&&&& ADD& DI 07H
BBB& MOV& AX BX
&&&&&& AND AX000FH
&&&&& CMP AL0AH
&&&&& JB QQQ
&&&&& ADD AL07H
QQQ ADD AL30H
&&& &MOV [DI]AL
&&&& DEC DI
&&&& PUSH CX
&&&& MOV CL04
&&&& SHR BXCL
&&&& POP CX
&&&& LOOP BBB
&&&& MOV CX0004H
CCCMOV AXDX
AND AX000FH
DDDADD AL30H
&&&& MOV [DI]AL
&&&& DEC DI
BEGINMOV AXDATA
&&&&&& MOV DSAX
&&&&&& MOV CXCOUNT
&&&&&& CALL WDADD
&&&&&& CALL SHOW
&&&&&& MOV DXOFFSET RESULT
&&&&&& MOV AH09H
&&&&&& INT 21H
&&&&&& MOV AH4CH
&&&&&& INT 21H
CODE& ENDS
&&&&&&& END& BEGIN
执行程序EXAM42-1。EXE,屏幕上显示结果:
4& EXAM4-2
SSEG SEGMENT STACK
DB 1024 DUP(0)
DATA SEGMENT
BUFO& DB 6 DUP(/)$
ARRA& DW -1759-289300-273277100045
CDUNT EQU $-ARRA
DATA& ENDS
CODE& SEGMENT
ASSUME CSCODEDSDATASSSSEG
DABC& PROC
&&&&&&& CMP AX0
&&&&&&& JGE& ET
&&&&&&& NEG& AX
ET&&&& RET
DABC& ENDP
DISPS& PROC
&&&&&& PUSH DX
&&&&&& PUSH AX
&&&&&& MOV &DXDI
&&&&&& MOV &AH09H
&&&&&& INT& 21H
&&&&&& MOV& DL
&&&&&& MOV &AH02H
&&&&&& INT& 21H
&&&&&& POP& AX
&&&&&& POP& DX
&&&&&& RET
DISPS& ENDP
DATCH PROC FAR
&&&&&& PUSH DX
&&&&&& PUSH CX
&&&&&& PUSH BX
&&&&&& MOV CX10
&&&&&& MOV BXAX
&&&&&& CALL DABC
DLOP1DEC DI
&&&&&& XOR DXDX
&&&&&& DIV CX
&&&&&& OR DL30H
&&&&&& MOV [DI]DL
&&&&&& CMP AX0
&&&&&& JNZ DLOP1
&&&&&& CMP& BX0
&&&&&& JNZ& DLOP1
&&&&&& CMP& BX0
&&&&&& JGE& DEXIT
&&&&&& DEC& DI
&&&&&& MOV& BYTE PTR[DI]
DEXITPOP BX
&&&&& POP& CX
&&&&& POP& DX
DATCH& ENDP
BEGINMOV AXDATA&&&&&
MOV& DS& AX
MOV& DX& CONUT/2
LPO1& DEC& DX
&&&&&& MOV& CX& DX
&&&&&& MOV& BX& DX
&&&&&& MOV&& SI& COUNT-2
LOP2& MOV&& AX& ARRA[SI]
&&&&&& CMP&&& AX& ARRA[SI-2]
&&&&&& JGE&&&& PASS
&&&&&& XCHG&& ARRA[SI-2]&& AX
&&&&&& MOV&&&& ARRA[SI]&&& AX
&&&&&& MOV&&& BX&& CX
PASS SUB& SI& 2
&&&& LOOP&&& LOP2
&&&& CMP&& BX&& DX
&&&& JE& &&&DLAST
&&&& JMP&&&& LOP1
DLAST MOV&& CX&& COUNT/2
&&&&&& LEA&&& SI&&&&& ARRA
LOP3 MOV&& AX& [SI]
&&&&& MOV&& DI&& OFFSET& BUFO
&&&&& ADD&& DI&&& LENGTH&& BUFO
&&&& CALL&& DATCH
&&&& CALL&& DISPS
&&&& ADD&&& SI& 2
&&&& LOOP&&& LOP3
&&&& MOV&&& AH&& 4CH
&&&& INT&&& 21H
&&&& CODE&&&& ENDS
&&&& END&&&&& BEGIN
EXAM4-2EXE&
-289& -27& -1& 9& 32& 45& 75& 77& 300& 10000
5&& EXAM5-1
& STACK&&& SEGMENT&&& STACK
&&&&&&&&&&&& DB&& 1024& DUP(0)
&STACK&&&& ENDS
&CODE&&&&& SEGMENT
& &&&&&&&&&&&ASSUME&& CS& CODE& SS& STACK
START&&& MOV&&& BL&&&& 0
LP&&&&&&& MOV&&& DL&&& 20H
&&&&&&&&&& MOV&&& AH&&&& 2
&&&&&&&&&& INT&&&& 21H
&&&&&&&&&& MOV&&& AL&&& BL
&&&&&&&&&& ADD&&& AL&&&& 0
&&&&&&&&&& DAA
&&&&&&&&&& AND&&& AL&&&& 0FH
&&&& &&&&&&MOV&&& BL&&&& AL
&&&&&&&&&& PUSH&& BX
&&&&&&&&&& OR&&&&& AL&&&&& 30H
&&&&&&&&&& MOV&&&& DL&&&& AL
&&&&&&&&&& MOV&&&& AH&&&&& 2
&&&&&&&&&& INT&&&&& 21H
&&&&&&&&&& MOV&&&& BX&&&&&& 3E8H
MOV&& BX&&&& 3E8H
LP2& MOV&& CX&&&&& 176H;1ms
LP1& PUSHF
&&&&& POPF
&&&&& LOOP&&&& LP1
&&&&& DEC&&&&& BX
&&&&& JNZ&&&&&& LP2
&&&&& POP&&&&&& BX
&&&&& INC&&&&&& BL
&&&&& JMP&&&&&& LP
CODE&& ENDS
&&&&&&&& END&&&&&& START
EXAM5-1EXE&
01& 2& 3& 4& 5& 6& 7& 8& 9&
& STACK& &&SEGMENT& SATCK
&&&&&&&&&&&& DB&& 1024& DUP0
STACK&&& ENDS
DATA&&&& SEGMENT
BUFF&&&& DB& 6& 7& DUP $
DATA&&&& ENDS
INPUT&&& MACRO&&& BUFE
&&&&&&&& MOV&& DX&&& OFFSET&&& BUFE
&&&&&&&& MOV&& AH&&& 0AH
&&&&&&&& INT&&&& 21H
&&&&&&&& ENDM
PUTCHAR& MARCO&&& CHAR
&&&&&&&&&& MOV&& DL&&& CHAR
&&&&&&&&&& MOV&& AH&&& 02H
&&&&&&&&&& INT&&&& 21H
&&&&&&&&&& ENDM
CODE&& SEGMENT
&&&&&&&& ASSUMENT& CS& CODE& DS& DATA& SS& STACK
START& MOV&& AX&& DATA
&&&&&&&& MOV&& DS&& AX
&&&&&&&& INPUT&& BUFF&&&&&&& &&&&& BUFF
&&&&&&&& PUTCHAR&&& 0DH
&&&&&&&& PUTCHAR&&& 0AH&&&&&&&&
&&&&&&&& MOV& CX& 0003H
NEXT& PUTCHAR&& 2AH
&&&&&&&& LOOPNEXT
&&&&&&&& MOV&&& CL& BUFF+1
&&&&&&&& SUB&&&& CH& CH
&&&&&&&& MOV&&& BX OFFSET& BUFF+2
BEGIN MOV&& AL& [BX]
&&&&&&&& PUTCHAR&& AL
&&&&&&&& INC&&&&&& BX
&&&&&&&& LOOP&&&& BEGIN
&&&&&&&& MOV&&&&& CX&& 0003H
NEXR1 PUTCHAR&&& 2AH
&&&&&&&&& LOOP&&&&&&& NEXT1
&&&&&&&&& MOV&&&&&&&& AH&&& 4CH
&&&&&&&&& INT&&&&&&&&&& 21H
CODE&& ENDS
&&&&&&&& END&&&&&&&&&& START
EXAM5-2EXE HELLO
***HELLO***
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:3549次
排名:千里之外

参考资料

 

随机推荐