汇编语言实验(8)

合集下载

汇编语言实验报告1~7

汇编语言实验报告1~7

汇编语言实验报告1~7实验一:数据传输指令、算术指令、逻辑指令的使用实验内容:利用汇编语言,编写一个程序,实现两个整数相加,并将结果存入第三个变量中实验步骤:1. 声明三个变量a、b、c2. 将10存入a,将20存入b3. 将a的值传入al,将b的值传入bl4. 使用add指令将al和bl相加,将结果存入al5. 将al的值传入c6. 显示c的值实验结果:a db 10mov al,aadd al,blint 21hmov ax,4c00h实验二:分支指令的使用实验内容:利用汇编语言,编写一个程序,实现当输入的值为正数时,输出"I'm positive!";当输入的值为负数时,输出"I'm negative!";当输入的值为零时,输出"I'm zero!"1. 定义一个变量num2. 接收用户输入,并将其存储在num中3. 用test指令判断num的值4. 当num=0时,执行输出"I'm zero!"的指令7. 退出程序num db ?lea dx, promptsub al, '0'test num, numjz zerojs negjmp positiveneg:output:zero_msg db 'I am zero!$'prompt db 'Please enter a number:', 0dh, 0ah, '$'1. 定义变量i、sum,分别表示累加的数字和累加和2. 将i赋初值1,sum赋初值03. 进入循环5. 使用inc指令将i加16. 使用cmp指令将i与10比较,如果i小于等于10,继续循环,否则退出循环7. 输出结果mov bx, iloopStart:inc bx实验四:过程调用的使用2. 循环遍历1到100之间的每个数3. 用一个for语句嵌套一个for语句判断该数是否为质数4. 用两个自定义的子程序is_prime和output输出结果call is_primeskip:cmp i, 100prime_loop:div blretje newlinejmp done实验目的:掌握字符串操作指令的使用实验内容:利用汇编语言,编写一个程序,将字符串"SJTU"改为字符串"MIT"1. 定义字符串SJTU和MIT2. 定义两个变量i和len,分别表示字符串的下标和长度3. 使用movsb将SJTU的值传到MIT中4. 输出MITSJTU db 'SJTU'lea si, SJTUstringLoop:实验内容:利用汇编语言,编写一个程序,实现将输入的字符串写入一个文件中,然后再读取该文件中的字符串并输出2. 打开文件3. 将字符串写入文件中4. 关闭文件6. 读取文件内容8. 输出读取的字符串fileName db 'test.txt'content db 32 dup(?)mov cx, word ptr [content]实验内容:利用汇编语言,编写一个程序,在系统按下Ctrl+C时,输出一条信息并退出1. 声明函数handleCtrlC2. 获取中断21的地址,将其存储到文件头中org 100hmov [old_int_21h], es:bxmov dx, offset handleCtrlCend开始:。

《汇编语言》实验报告

《汇编语言》实验报告

《汇编语言》实验报告实验名称:汇编语言实验报告实验目的:通过实验了解汇编语言的基本概念、语法结构和程序设计方法,掌握汇编语言的编写方法。

实验时间:2024年1月1日实验地点:实验室一、实验背景汇编语言是计算机硬件和软件之间的桥梁,通过汇编语言可以直接操作计算机的底层硬件。

汇编语言是一种低级语言,使用汇编语言可以实现对计算机内存、寄存器等硬件资源的直接操作,从而实现程序的功能。

本实验通过编写汇编语言程序,加深对汇编语言的理解。

二、实验过程1. 确定实验环境:使用DOSBox模拟DOS环境进行汇编程序编写和调试。

2. 编写第一个汇编程序:编写一个简单的汇编程序,将字符串“Hello, World!”输出到屏幕上。

3.程序分析:a.定义要输出的字符串,将字符串存储在数据段中。

b.设置段寄存器,将数据段地址加载到DS寄存器中。

c.设置显示模式和光标位置。

d.将字符串逐个字符输出到屏幕上。

e.关闭显示模式。

4. 编译运行:使用汇编语言的编译器将汇编程序转换成机器码,并在DOSBox中运行程序。

5.调试程序:根据程序运行结果和分析,调试程序中存在的错误,并进行改正。

三、实验结果与分析经过多次编写和调试,我们成功实现了将字符串“Hello, World!”输出到屏幕上的功能。

通过程序分析和调试过程,加深了对汇编语言的理解和掌握。

四、实验总结通过本次实验,我们深入了解了汇编语言的基本概念、语法结构和程序设计方法。

通过实际编写汇编语言程序,对汇编语言的编写方法有了更加深入的认识。

同时,通过调试程序的过程,我们也提高了自身的问题解决能力和分析能力。

在今后的学习和工作中,我们将继续学习和深入研究汇编语言,提高自己的编程能力和创新思维能力。

总体而言,本次实验给我们带来了很大的收获,我们以后将更加努力地学习汇编语言,提高自己的编程水平,为以后的学习和工作做好充分的准备。

王爽《汇编语言》实验8

王爽《汇编语言》实验8

王爽《汇编语⾔》实验8
实验8是要求阅读⼀个很奇葩的代码:
assume cs:code
code segment
mov ax, 4c00h
int 21h
start: mov ax, 0
s: nop
nop
;下⾯这段代码主要是把s2的内容复制到s处
mov di, offset s
mov si, offset s2
mov ax, cs:[si]
mov cs:[di], ax
s0: jmp short s
s1: mov ax, 0
int 21h
mov ax, 0
s2: jmp short s1
nop
code ends
end start
先看看开始时代码在内存的存在:
对⽐前⾯的代码,可以看出,程序从start处开始运⾏,然后⼀直运⾏到mov cs:[di], ax处,
此时再查看内存:
发现标签s处的代码已经被更改成为jmp 0000,但是s2处的明明是jmp short s1啊,为什么把代码复制到s处就不同了?
再仔细观察,发现这个指令的机器码EBF6并没有改变,⽽因为jmp short是段内转移,机器码记录的是位移,F6对应的是-8的位移,⽽由于s 刚好处于cs:0008处,运⾏jmp后刚好后移8位,到达最开始的mov ax, 4c00h处,到此运⾏结束。

这⾥对于这个-8的位移控制得⾮常精妙,从s2转移到s1需要-8的位移,⽽从s转移到段头处也刚好是-8的位移,所以程序运⾏成功。

从这⾥可以看出,⼀个精妙的汇编代码⽐⾼级语⾔更有意思^_^。

(最新版)汇编语言实验报告

(最新版)汇编语言实验报告

(最新版)汇编语言实验报告汇编语言课程设计学院:专业:姓名:学号:汇编语言是计算机专业的一门重要的专业基础课,主要介绍汇编语言程序设计的基本原理和方法。

汇编语言是一门理论性和实践性较强的课程,辅助课堂教学的实验有助于帮助学生理解汇编语言的基本原理,锻炼学生的动手能力,提高学生的综合应用知识的能力。

目录1 利用DEBUG调试汇编语言程序段………………………………………2 初级程序的编写与调试实验(一).................................................................................3 初级程序的编写与调试实验(二)………………………………………...4 汇编语言程序上机过程 .......................................................................................................... 5分支程序实验……………………………………………………………6 循环程序实验……………………………………………………………..1 利用DEBUG调试汇编语言程序段一.课程目的1.熟悉DEBUG有关命令的使用方法;2.利用DEBUG掌握有关指令的功能;3.利用DEBUG运行简单的程序段。

二.课程内容1.进入和退出DEBUG程序;2.学会DEBUG中的1)D命令(显示内存数据D 段地址:偏移地址)例1:-D1002)E命令(修改指定内存)例1:-E100 41 42 43 44 48 47 46 45-D 100,L08结果:08F1:0100 41 42 43 44 48 47 46 45例2:-E 100:08F1:0100 76 42 :42是操作员键入此命令是将原100号内存内容76修改为42,用D命令可察看。

3)R命令(显示当前寄存器的内容)4)T命令(设置陷井,单步执行)5)A命令(将指令直接汇编成机器码输入到内存中。

汇编语言程序实验

汇编语言程序实验

汇编语言程序实验实验目的【1】运用数值运算,通过编程及调试,熟悉8086|8088运算指令及DEBUG动态调试程序的方法【2】通过非数值运算编程,进一步掌握编程技巧和方法,这部分可以多做一些,题题目也较多【3】初步熟悉DOS系统和BIOS功能调用,其实前面要求中也包含着部分内容,比如数值运算包含显示功能调用一、实验原理【1】8086内部结构简介以下是微处理器的简要内部结构图其内部大概是有寄存器组,运算器,控制器,通过总线连接而成其中,标志寄存器用来指示运算结果的某些性质在编程中会反复用到这些寄存器,各个寄存器的作用如上表已经列出,表中的四个寄存器AX,BX,CX,DX都可以分别成为两个8位的寄存器,如AX可以拆开用成AH和AL,分别表示高八位和低八位【2】8086指令系统一条指令有操作吗,目的操作数和源操作数组成,指令简要分为以下几类(1)数据传送类,如MOV,LEA,XCHG等(2)算术逻辑类,如ADD,ADC,SUB,SBB等(3)移位与旋转类,(4)跳转类指令,又细分为段内,段间跳转,跳转范围不同(5)伪指令,伪指令只是对指令的说明,其本身不占内存单元【3】汇编语言的基本语法一般要把每段的信息都交代,由于8086的系统是分段的,因此程序的数据与代码都应放在相应的段中,段按性质可分为代码段,数据段,堆栈段等,一个程序至少要有一个代码段具体的说明后面结合程序再作介绍【4】DEBUG命令介绍在DOS环境下可以用DEBUG命令对程序进行调试,DEBUG命令具体有以下几条,简介其各条指令的功能(1)A 汇编命令,从此命令往下逐行汇编(2)P和T命令单步执行命令,也就是跟踪命令,只是T命令跟踪到循环体中去(3)D 内存显示命令(4)R 寄存器显示命令(5)Q 推出DEBUG的命令当然还有不少,这里就不一一列举了,熟悉以上的准备知识,下面就可以着手编程了。

二、实验内容针对实验目的,每一个要求都选做不少于两个题目,共完成以下的实验内容【1】数值运算类,完成20个8位无符号二进制数的求和【2】完成减法运算,例如123456-789123【3】非数值运算类,统计一百个数中正负数和零的个数【4】代码转换,完成组合BCD码与二进制码的转换【5】排序,将80个数按升序排列【6】BIOS功能调用,将运算结果显示出来【7】回显,键入一个数字或字符,回显在屏幕上【8】画一个矩形废话少说,直接上程序1.加法程序,以下程序实现20个8位无符号数的相加,并显示结果【设计思想】:将20个数放入一段内存,使用LOOP循环20次,每次取出一个数,不断和之前AX之中的和数相加【难点解决】:由于是第一个程序,那些格式都要熟悉,本程序就一个循环,难点是显示部分,要不断右移,逐位显示;加法程序全文如下DATA SEGMENT ;数据段TAB DW 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 ;随便自定义20个数DATA ENDS ;数据段结束CODE SEGMENTASSUME CS:CODE,SS:STACK,DS:DATASTART: MOV AX,DATA ;代码段开始MOV DS,AXMOV AX,0MOV CX,20 ;CX放20,用于控制循环次数LEA SI,TAB ;SI存放TAB首地址MOV BX,0 ;BX寄存器清零SUM: MOV AX,[SI] ;开始相加,AX取得第一个加数ADD BX,AXINC SI ;SI加1,指向下一个数INC SILOOP SUM ;一次相加结束,LOOP循环PUSH BX ;相加结束,结果存于BX中LOP2: MOV CL,04 ;CL控制移位位数AND BL,0F0H ;取BL高四位SHR BL,CLMOV DL,BL ;DL存放数据用于显示ADD DL,30H ;转换成ASC2码CMP DL,3AH ;如果数字大于9,转化时再加7JB NEXTADD DL,7NEXT: MOV AH,2 ;2号功能调用,显示高位INT 21HPOP BXLOP1: MOV DL,BL ;做同样的事情,显示BL低4位AND DL,0FHADD DL,30HCMP DL,3AHMOV AH,2INT 21HMOV AH,4CH ;程序正常结束INT 21HCODE ENDSEND START2、减法程序,实现减法并显示结果,123456-789123【设计思想】(1)首先判断两个数那个大,大的减小则结果为正,否则为负,但程序始终使用大的减小的(2)低位数字在前,两位两位相减,结果存于开辟的数据段中【难点解决】难点在于显示,判断部分也不是很麻烦程序如下,有些不重要的部分就不写了,浪费时间DATA SEGMENT 'DATA' ;数据段定义ORG 0100HDATA1 DB 56,34,12 ;注意高位是在后面的,前面的反而是低位DATA2 DB 23,91,78RESULT DB 'H', 6 DUP(0),'$'DATA ENDSCODE SEGMENT 'CODE'ASSUME DS:DATA ASSUME CS:CODESTART: MOV AX,DATAMOV DS,AXMOV CX,3 ;控制循环LEA DI,DATA1 ;DI取得DATA1的首地址LEA SI,DATA2 ;SI取得DATA2的首地址ADD DI,2ADD SI,2 ;SI ,DI自加2,获得最高位地址用于比较PUSH AXPUSH BX ;AX,BX压栈以保存原值MOV AX,[DI]MOV BX,[SI] ;判断SI,是否比DI数大SUB AX,BX ;如果大于,则互换指针,并且输出负号JNB LOOOPMOV AH ,2MOV DL,‘—’INT 21HLOOOP:LEA BX,RESULT ;如果DI中本来就是大数,直接减CLC ;进位清零LP: MOV AL,[DI]SBB AL,[SI] ;开始减法运算MOV [BX],AL ;结果存于BX所指内存中INC DI ;地址都自加1INC SIINC BXLOOP LP ;循环3次,完成所有减法MOV CX,0204HPUSH CXLOP1: LEA BX,RESULT ;运算结果存于RESULT中,一下实现显示MOV AX,[BX]ROL AX,CLMOV DL,ALAND DL,0FHADD DL,30HCMP DL,3AH ;这与第一个一样,逐位显示JB NEXT1ADD DL,7NEXT1: MOV AH,2INT 21HDEC CHCMP CH,0JNZ LOP1POP CXMOV AH,4CH ;程序正常退出INT 21HCODE ENDSEND START这个程序还是要注意算法,一开始都不注意,上来直接减,其实不管怎么算,都是大数减小数,检查时老师提出了这一点3、统计,非数值运算类,统计一百个数中正负数,0的个数【设计思路】通过比较判断,用两个选择结构,实现对三个变量的逐个加1 【难点解决】关键是做到不遗漏,不重复的分类,每次只有一个自加,自家完后必须直接跳到本次循环最后DATA SEGMENT 'DATA'TAB DB 1,2,3,4,0,0,0,-2,0,-4 ;随便定义一些数DATA ENDSCODE SEGMENT 'CODE'ASSUME DS:DATAASSUME CS:CODESTART: MOV AX,DATAMOV DS,AXMOV AX,0MOV DX,0MOV CX ,10LEA SI,TABSU: MOV BL,[SI]ADD BL,BLJNZ LOP3 ;判断是否为0,不是就跳转INC AL ;存放0JMP EDLOP3: ADD BL,0JS LOP1 ;判断是否为正数,不是就跳转INC DH ;正数个数JMP EDLOP1: INC DL ;负数个数JMP EDED: INC SILOOP SU ;完成一次循环PUSH DXMOV DL,AL ;以上完成统计,下面完成结果显示ADD DL,30H ;输出0的个数MOV AH,2INT 21HPOP DXPUSH DXMOV AX,DX ;输出正数个数MOV DL,AHADD DL,30HMOV AH,2INT 21HPOP DXMOV AX,DXMOV DL,AL ;输出负数个数ADD DL,30HMOV AH,2INT 21HMOV AH,4CHINT 21HCODE ENDSEND START就是显示三个统计结果时没有间隔,两位16进制数紧挨着,说明一下4、代码转换,完成组合BCD码到二进制数的转换【设计思路】如提示所给的,利用(((A×10)+B)×10)+C)×10)+D的算法【难点解决】程序实现一个十进制转化为二进制,其实是16进制,程序经过一些拆开乘10的运算,保持原数大小不变,但存到寄存器中的数默认已经是16进制的了,要逐位找到A,B,C,D还要循环控制乘以10,程序如下,组合BCD码转换DATA SEGMENTDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV BX,0MOV SI,0AH ;SI中放的是10,用来相乘MOV CL,4 ;用来控制移位位数MOV CH,3 ;控制循环次数MOV AX,9649H ;赋给要转化的数LP: ROL AX,CL ;AX中的数左移4位PUSH AX ;保存现在的AX值AND AX,0FH ;取AX最低位ADD AX,BXMUL SI ;乘以10MOV BX,AX ;值暂时保存在BX中POP AXDEC CH ;CH减1,循环了一次JNZ LP ;如果循环三次完成,跳转到LP位置ROL AX,CL ;这是个位的数,不用乘10了AND AX,0FHADD AX,BXMOV BX,AX ;BX中存放的是转化过的数MOV AX,0 ;以上已经转化完成,下面是显示的程序了MOV CX,0404HPUSH CXLOP1: ROL BX,CL ;这个程序在每一个程序最后的显示部分都会有MOV DL,BL ;就是一个逐位显示的程序AND DL,0FHADD DL,30HCMP DL,3AH ;判断ASCII码,显示的入口参数是ASCII码JB NEXTADD DL,7NEXT: MOV AH,2INT 21HDEC CHCMP CH,0JNZ LOP1 ;判断是否显示完成POP CXMOV AH,4CHINT 21H ;系统功能调用,程序结束CODE ENDSEND START5、排序,实现对10个数的降序排列其实就是很熟悉的冒泡法排序,具体思路不用再罗嗦了,直接上程序STACK SEGMENT STACK ;定义堆栈段DW 300 DUP(?)STACK ENDSDATA SEGMENT ;数据段定义TAB DB 01H,31H,08H,24H,99H,0A2H,67H,0ACH,2BH,5CHTAB1 DB 'H,','$'DATA ENDSCODE SEGMENTASSUME CS:CODE,SS:STACK,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV CL,9 ;外循环次数为9LOP1: MOV CH,9LEA SI,TAB ;分别取地址LEA DI,TABLOP2: MOV AL,[SI]INC SIMOV AH,[SI] ;实现交换MOV BL,ALMOV BH,AHSUB BH,ALJC NETJMP NET1NET: XCHG AH,ALMOV [DI],ALINC DIMOV [DI],AHJMP NET2NET1: MOV [DI],ALINC DIMOV [DI],AHJMP NET2NET2: DEC CHTEST CH,0FFHJNZ LOP2DEC CLTEST CL,0FFHJNZ LOP1PRIT: LEA SI,TABMOV CH,10LOP3: MOV DL,[SI]INC SIMOV CL,04HMOV BL,DLROL BL,CLMOV DL,BLAND DL,0FHADD DL,30HCMP DL,3AHJB NEXTADD DL,7NEXT: MOV AH,2 ;2号功能调用INT 21HROL BL,CLMOV DL,BLAND DL,0FHADD DL,30HCMP DL,3AHJB NEXT1ADD DL,7NEXT1:MOV AH,2INT 21HMOV AX,SEG TAB1MOV DS,AXMOV DX,OFFSET TAB1 ;入口参数MOV AH,9 ;9号功能调用INT 21HDEC CHTEST CH,0FFHJNZ LOP3MOV AH,4CHINT 21HCODE ENDSEND START6、字符回显,系统功能调用,实现输入字符在屏幕上显示出来【设计思路】即使用2个系统功能调用,很简单的,没什么难得,特别是在写完前面那些程序之后,结合程序注释说明我的程序;加法程序STACK SEGMENT STACK ;堆栈段定义STACK ENDSDATA SEGMENT ;数据段定义,虽然说明也么有DATA ENDSCODE SEGMENTASSUME CS:CODE,SS:STACK,DS:DATASTART: ;代码段开始MOV AX,DATAMOV DS,AXMOV AH,08 ;8号系统功能调用INT 21H ;键入的字符存放于AL中MOV DL,AL ;以下完成显示部分ADD DL,30HCMP DL,3AHJB NEXTADD DL,7NEXT:MOV AH,2INT 21HMOV AH,4CH ;程序正常退出INT 21HCODE ENDSEND START7、画一个矩形其实也就是调用功能,利用循环控制不断划线,程序如下显示彩色矩形DATA SEGMENTLINE DW 0 ;矩形块左上角的行ROW DW 0 ;矩形块左上角的列PIX DB 0 ;矩形块的颜色DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TASTART: ;主程序MOV AX , DATAMOV DS , AXMOV AH , 0MOV AL , 4INT 10H ;设置320×200彩色图形方式MOV AH,0BHMOV BH,01MOV BL,01INT 10HMOV CX, 4L1:CALL DISP_RECTcall delayinc PIX ;每循环一次,点的颜色加1ADD ROW , 30 ;改变下一个方块的显示位置LOOP L1MOV AH , 4CHINT 21H ;返回DOS;显示矩形块的子程序,矩形块的显示位置由DATA段中的LINE、ROW变量指定,;颜色由PIX变量指定,矩形块的大小是固定的,为10个点宽,100个点高。

汇编实验报告(详细版)

汇编实验报告(详细版)

计算机组成与汇编语言(实验报告)内容: 实验一、六、七、八院系专业:计算机学院计算机科学与技术姓名:xxxxxxxxx学号:*******xxxxx完成时间:2012年12月1日计算机组成与汇编语言实验报告printf("输入的二进制数不正确!!");break;}}}if(a[15]=='1')s++;for(i=1;i<16;i++){if(a[15-i]=='1')s+=(1<<i);}printf("二进制: ");puts(a);printf("对应的十进制为: ");printf("%d\n",s);}程序1运行结果:实验情况与体会:运行过程中出现过不能判断是否输错的情况以及权位判断有误等情况,经过思考和修改后修改正确,说明理解好二进制与十进制之间的转换过程很重要。

编程过程中主要碰到的问题是,不够十六位的时候要在前面补零。

转换方法主要是除二求余的方法。

注:篇幅不够,可以另外附页。

计算机组成与汇编语言实验报告姓名xxxx 学号2011004xxxx 计分专业软件工程班级xxxxx 实验日期2012年 12 月 1日实验名称实验六分支结构程序设计实验目的●熟悉有符号定点数的表示。

●掌握原码、补码、反码之间的相互转换程序设计。

实验内容说明:该程序中X=23,Y=45,他们之差的绝对值为22,用16进制表示为0016H,即图中显示的结果2.调试程序2:DATA SEGMENTADD AL, 07HLP4: ADD AL, 30H ;将低四位转化为相应的ASCII码并以字符形式输MOV DL, ALMOV AH, 2INT 21HMOV AH, 4CHINT 21HCODE ENDSEND START上机运行该程序并检查运行结果是否正确。

上机实验过程:说明:求出三个数里面的最大数73;3. 编写程序1:编程实现从键盘输入一位数字,判断其奇偶性,并在屏幕上输出一个标志,若为奇数,则输出1,否则输出0。

汇编语言实验报告

汇编语言实验报告

计算机专业类课程实验报告课程名称:汇编程序语言设计学院:计算机科学与工程专业:计算机科学与技术学生姓名:林*学号:*************指导教师:胡*日期:2014年12 月15 日电子科技大学计算机学院实验中心电子科技大学实验报告实验一1、实验名称:汇编源程序的上机调试操作基础训练2、实验学时:43、实验内容和目的:实验内容:1.DEBUG命令的使用2.程序的调试与运行1.编写程序计算以下表达式: Z=(5X+2Y-7)/2设X、Y的值放在字节变量VARX、VARY 中,结果存放在字节单元VARZ中。

实验目的:1.掌握DEBUG的基本命令及其功能2.学习数据传送和算术运算指令的用法3.熟悉在PC机上编辑、汇编、连接、调试和运行汇编语言程序的过程。

4、实验原理:1.编辑源程序,建立一个以后缀为.ASM的文件.2.汇编源程序,检查程序有否错误,有错时回到编辑状态,修改程序中错误行。

无错时继续第3步。

3.连接目标程序,产生可执行程序。

4.用DEBUG程序调试可执行程序,记录数据段的内容。

5、实验器材(设备、元器件)pc、window7平台、masm5开发环境6、实验步骤:1、在数据段中分别用两个单元varx和vary存放变量x 和y;另一个单元varz用来存放运算结果Z;2、由于是字节变量,所以用al 存放变量x的值,然后将al 左移两位得到4*x,再把al加上x,进而得到5*x;3、再用bl存放变量y 的值,用add命令得到2*y,之后把al 与bl相加,再用sub命令减去7,得到(5*x+2*y-7)的值,并保存到al中;4、最后将al右移一位,得到最后的z=(5*x+2*y-7)/2,并把al 的值送入varz单元;5、运行程序,使用-d 命令查看内存单元的信息;7、实验数据及结果分析:实验代码如下:电子科技大学计算机学院实验中心实验结果如下图:1、编译连接后执行程序:2、查看内存单元变量的值varx=05h,vary=07h,(5x+2y-7)/2=(25d+14d-7d)/2d=16d=10h可以看到上图中内存单元的值与手工计算的结果相符,说明程序是正确的。

汇编语言学习知识程序设计实验

汇编语言学习知识程序设计实验

汇编语⾔学习知识程序设计实验⽬录⽬录 (1)实验⼀利⽤DEBUG熟悉常⽤指令的使⽤ (2)⼀、实验⽬的 (2)⼆、⽰例 (2)三、实验题 (2)实验⼆汇编程序和连接程序的使⽤ (6)⼀、实验⽬的。

(6)⼆、⽰例。

(6)三、实验题。

(8)实验三顺序结构程序设计 (11)⼀、实验⽬的 (11)⼆、⽰例 (11)三、实验题 (12)四、实验报告 (15)实验四循环结构程序设计 (16)⼀、实验⽬的 (16)⼆、⽰例 (16)三、实验题 (18)实验五分⽀结构程序设计 (21)⼀、实验⽬的 (21)⼆、⽰例 (21)三、实验题 (22)实验六⼦程序设计 (29)⼀、实验⽬的 (29)⼆、实验题 (29)实验⼀利⽤DEBUG熟悉常⽤指令的使⽤⼀、实验⽬的熟悉指令系统,掌握常⽤指令的⽤法;通过实验加深对各种寻址⽅式的理解;能熟练使⽤DEBUG中的命令对指令进⾏反汇编,观察并了解机器代码。

⼆、⽰例请分别⽤⼀条汇编语⾔指令完成如下功能:(过程略)。

1.⽤寄存器BX和SI的基址变址寻址⽅式把存储器的⼀个字节与AL寄存器的内容相加,并把结果送到AL中。

ADD AL,[BX][SI]2.⽤位移量为0520H的直接寻址⽅式把存储器中的⼀个字与3412H相加,并把结果送回该存储单元。

ADD WORF PTR [0520H],3412H三、实验题1.调试、验证下列指令的结果,已知(DS)=2000H,(BX)=0100H,(SI)=0002H,(BP)=0200H,(SS)=2300H,(20100)=12H,(20101)=34H,(20102)=56H,(20103)=78H,(21200)=2AH,(21201)=4CH,(21202)=B7H,(21203)=65H,(23204)=88H,说明各指令执⾏完后AX寄存器的内容。

要求输⼊指令,相应存储单元的内容要事先设置,单步P执⾏,观察执⾏结果。

(设置存储器的值)①.MOV AX,1200H②.MOV AX,BX③.MOV AX,[1200H]④.MOV AX,[BX]⑤.MOV AX,1100[BX]⑥.MOV AX,[BX][SI]⑦.MOV AX,1100[BX][SI]⑧ .MOV AX,[BP+SI+04]2、上机调试、验证教材习题3.15。

汇编语言实验报告

汇编语言实验报告

汇编语言实验报告
1. 实验简介
本次实验是针对汇编语言的学习和实践,在实验中,我们将学习如何使用汇编语言编写程序、调试程序,并通过一系列实例来练习和巩固所学知识。

2. 实验目的
(这一部分可以根据实际情况来写,列举实验的具体目的和要求)
3. 实验环境及工具
(介绍实验所使用的软件环境和工具,如:编译器、调试器)
4. 实验步骤
(根据实验内容具体描述实验步骤,可以分为多个小节)
4.1 准备工作
在开始实验之前,需要进行一些准备工作,包括安装编译器、创建工作环境等。

4.2 实验一:简单的汇编程序
本实验通过编写一个简单的汇编程序来熟悉汇编语言的基本语法和指令集,包括数据传送、算术运算、逻辑运算等。

4.3 实验二:汇编程序的调试
在实验二中,我们将学习如何使用调试器对汇编程序进行调试,包括设置断点、查看变量值、单步执行等操作。

4.4 实验三:汇编程序的优化
本实验将通过优化代码来提高程序的执行效率,包括减少指令的使用、优化循环结构等。

5. 实验结果与分析
(对实验的结果进行总结和分析,可以包括程序的输出结果、性能分析等)
6. 实验总结
(针对本次实验的收获和心得体会进行总结,可以包括对汇编语言的理解、解决问题的思路等)
7. 实验感想
(对本次实验的感想和建议,如实验过程中遇到的困难、改进的方向等)
8. 参考文献
(列出本报告中所引用的参考文献)
注:该文章只是按照题目提示给出了一个大致的框架和构思,实际根据具体的实验内容和要求来编写每个小节的详细内容。

希望对你有所帮助!。

汇编语言上机实验汇总

汇编语言上机实验汇总

汇编语言上机实验汇总汇编语言是计算机的低级语言,主要用于编写底层程序和驱动程序。

在学习汇编语言的过程中,学生通常需要进行一定数量的上机实验。

下面是一个汇编语言上机实验的汇总。

1.实验一:环境搭建-目标:搭建汇编语言开发环境2.实验二:基本语法-目标:学习汇编语言的基本语法和指令格式-内容:编写一个简单的汇编程序,包括数据段、代码段和堆栈段,以及常用指令(例如MOV、ADD、SUB、JMP等)的使用。

3.实验三:寄存器和内存操作-目标:熟悉汇编语言中的寄存器和内存的操作-内容:编写一个汇编程序,通过MOV指令将数据从内存中加载到寄存器中,然后进行运算,并将结果存储回内存。

4.实验四:条件分支和循环-目标:掌握汇编语言中的条件分支和循环结构-内容:编写一个汇编程序,使用条件分支指令(例如CMP、JE、JNE 等)实现一个简单的判断语句;然后使用循环指令(例如LOOP)实现一个简单的循环结构。

5.实验五:子程序和参数传递-目标:学习如何创建和调用子程序,并传递参数-内容:编写一个汇编程序,其中包含一个子程序,该子程序接受两个参数并返回它们的和。

然后在主程序中调用该子程序,并输出结果。

6.实验六:中断和异常处理-目标:了解中断和异常处理机制,并在汇编程序中处理中断或异常-内容:编写一个汇编程序,其中包含一个中断处理程序,当发生特定的中断时,该处理程序将执行一些特定的操作。

7.实验七:串操作和文件操作-目标:学习汇编语言中的串操作和文件操作-内容:编写一个汇编程序,使用串操作指令(例如MOVS、LODS、STOS等)操作字符串;然后使用文件操作指令(例如OPEN、READ、WRITE 等)读取或写入文件。

8.实验八:图形和音频处理-目标:了解汇编语言中的图形和音频处理- 内容:编写一个汇编程序,使用图形库(例如BGI、OpenGL、DirectX)绘制简单的图形或运行一个音频文件。

这些上机实验可以帮助学生逐步掌握汇编语言的基本知识和技能,并为以后的高级汇编语言编程打下基础。

汇编语言实验

汇编语言实验

一、实验项目名称汇编语言程序上机过程二、实验目的熟练掌握汇编语言程序的编辑、调试和运行的过程和方法。

了解汇编语言程序的汇编、运行环境。

三、实验基本原理1.掌握常用的编辑工具软件(如WORD、EDIT)、MASM和LINK的使用;2.伪指令:SEGMENT,ENDS,ASSUME,END,OFFSET,DUP;3.利用的INT 21H的1号功能实现键盘输入的方法;四、主要仪器设备及耗材PC微机DOS操作系统或 Windows 操作系统MASM.EXE,LINK.EXE,或宏汇编集成环境五、实验步骤1.用用文字编辑工具(记事本或EDIT)将源程序输入,其扩展名为.ASM。

2.用MASM对源文件进行汇编,产生.OBJ文件和.LST文件。

若汇编时提示有错,用文字编辑工具修改源程序后重新汇编,直至通过。

3.用TYPE命令显示1产生的.LST文件。

4.用LINK将.OBJ文件连接成可执行的.EXE文件。

5.在DOS状态下运行LINK产生的.EXE文件。

即在屏幕上显示标题并提示你按键。

每按一键在屏幕上显示二个相同的字符,但小写字母被改成大写。

按ESC键可返回DOS。

若未出现预期结果,用DEBUG检查程序。

实验源程序:data segmentmessage db 'This is a sample program of keyboard and disply'db 0dh,0ah,'Please strike the key!',0dh,0ah,'$'data endsstack segment para stack 'stack'db 50 dup(?)stack endscode segmentassume cs:code,ds:data,ss:stackstart: mov ax,datamov ds,axmov dx,offset messagemov ah,9int 21hagain: mov ah,1int 21hcmp al,1bhje exitcmp al,61hjc ndcmp al,7ahja ndand al,11011111b nd: mov dl,almov ah,2int 21hjmp againexit: mov ah,4chint 21hcode endsend start六、实验数据及处理结果(1)程序运行结果:(2)在DEBUG下调试:反汇编操作:分步调试:七、实验总结通过这次实验我在电脑上的实际操作和观看,以及问老师同学我了解汇编语言程序的编辑、调试和运行的过程方法和汇编语言程序的汇编、运行环境,掌握了简单的汇编语言程序编写与调试, 以及在DOS状态下通过D命令、E命令、R命令、T命令、A命令、G命令,U命令、观察记个通用寄存器和标志寄存器具体结果和有关内存单元的内容。

汇编语言实验报告

汇编语言实验报告

汇编语言实验报告一、实验目的本次汇编语言实验的主要目的是通过实际操作和编程实践,深入理解汇编语言的基本概念、指令系统和编程方法,提高对计算机底层硬件操作的认识和编程能力。

二、实验环境1、操作系统:Windows 102、编程工具:MASM(Microsoft Macro Assembler)三、实验内容1、数据传送与算术运算实现两个 16 位整数的加法和减法运算,并将结果存储在指定的内存单元中。

使用不同的数据传送指令,如 MOV、PUSH、POP 等,将数据在寄存器和内存之间进行传输。

2、逻辑运算与移位操作对给定的 8 位二进制数据进行逻辑与、或、异或运算,并观察结果。

执行移位操作,包括逻辑移位(SHL、SHR)和算术移位(SAL、SAR),理解移位对数据的影响。

3、分支与循环结构使用条件跳转指令(如 JZ、JE、JC 等)实现根据不同条件执行不同代码段的功能。

编写循环结构程序,如使用 LOOP 指令实现对数组元素的求和操作。

4、子程序调用定义一个子程序,实现特定的功能,如计算一个数的阶乘。

在主程序中调用子程序,并传递参数和获取返回值。

四、实验步骤1、数据传送与算术运算实验首先,在代码编辑器中编写汇编代码,定义数据段和代码段。

在数据段中初始化两个 16 位整数,例如 MOV WORD PTR DATA1, 1000H 和 MOV WORD PTR DATA2, 2000H 。

在代码段中使用 ADD 和 SUB 指令进行加法和减法运算,如 ADD WORD PTR RESULT_ADD, DATA1 和 SUB WORD PTRRESULT_SUB, DATA2 。

编译和链接代码,生成可执行文件。

运行程序,查看内存中存储的运算结果。

2、逻辑运算与移位操作实验类似地,定义数据段和代码段。

在数据段中初始化 8 位二进制数据,如 MOV AL, 01010101B 。

在代码段中使用AND、OR、XOR 指令进行逻辑运算,以及SHL、SHR、SAL、SAR 指令进行移位操作。

基本演示汇编语言实验操作方法

基本演示汇编语言实验操作方法

基本演示1汇编语言实验操作方法一.实验的基本方法(MASM宏汇编子目录下)1.在DEBUG下运行汇编指令或简单小程序在DEBUG提示符下,用汇编命令A:输入汇编指令或简单小程序,用单步命令T 或全程命令G来执行,并检查执行中间结果与最后结果。

2.标准汇编程序上机方法A.建立ASM文件,用全屏幕编辑文件或其他编辑文件建立扩展名为ASM的源程序.B.用MASM(或ASM)产生扩展名为OBJ目标文件。

C.用LINK产生扩展名为EXE可执行文件。

D.在DEBUG下,把文件调入内存,调试程序。

E.在DOS下可直接执行扩展名为EXE的文件。

(详细过程)二.汇编语言的工作环境.A.硬件环境IBM-PC及其系列机内存256K字节以上外存:硬盘或至少一个软驱CPU:80586以上显示器:单色或彩色显示器键盘:标准ASCII码键盘B.软件环境编缉程序:或其他编缉程序汇编程序:MASM.EXE或ASM.EXE连接程序:LINK.EXE调试程序:或DEBUG.EXEA命令在命令A后跟地址,按回车输入程序,可以连续输入,当按下回车后,就退回到DEBUG下。

T命令T命令为跟踪命令。

G命令该地址指定了运行的起始地址,如不指定则从当前的cs:ip开始运行EDIT.EXE怎样生成.exe文件生成.obj文件基本演示2DEBUG命令的使用A.程序调用命令C>DEBUG[D:][PATH][FILENAME[.EXT]][PARM1][PARM2]其中,文件名是被调试文件的名字。

如未键入文件名。

可用DEBUG命令N和L 把需要文件装入存储器后再调试。

D指定驱动器,PATH为路径,FILENAME为文件名,PARM为命令参数B.显示存储单元命令-D[ADDRESS]或;ADDRESS地址-D[RANGE];RANGE范围C.修改存储单元内容命令-E ADDRESS[LIST]D.检查和修改寄存器内容命令-R[REGISTER NAME];Register name寄存器名字E.汇编命令-A[ADDRESS]F.跟踪命令-T[=ADDRESS][VALUE];Value变量值G.运行命令-G[=ADDRESS][ADDRESS2[ADDRESS3]H.反汇编命令-U[ADDRESS]-U[RANGE]I.命名命令-N FILESPECS[FILESPECS]FILESPECS的格式可为[D:][PATH]FILENAME[.EXT]J.装入命令-L[ADDRESS[DRIVE SECTOR SECTOR]];DRIVE SECTOR磁盘扇区K.写命令W ADDRESS DRIVE SECTORL.退出命令-QD命令D命令为显示存储单元的命令,.表示不可显示的字符如果只指定首地址,则显示从首地址开始的80个字节的内容。

汇编(循环、分支、子程序)实验报告

汇编(循环、分支、子程序)实验报告
1.设计:
分别为十个成绩、成绩总个数、分段的5个区间申请内存单元,初始化数据段;将AX,BX,CX压栈,保留原始数据。选取第一个成绩,存入AX中,该数据除以10,得到商存入BX,判断商的所属区间,给所属区间加1,继续下一个,循环直到十个全部判断结束,pop出栈,得到属于各区间的成绩个数,程序结束。
2.源程序清单
2.源程序清单
datasegment
xdw 1ah
ydw 0ah
zdw 01h
maxdw ?
dataends ;数据段定义
codesegment
assume ds: data, cs: code
start:
mov ax, data
mov ds, ax ;初始化数据段
mov ax, x
cmp ax, y
《汇编语言程序设计》实验报告
实验名循环、分支、子程序设计实验室实验楼实验日期2014-06-09
一、实验目的及要求
1.熟悉命令格式,功能,加强对指令系统的理解
2.编写简单循环、选择、子程序的结构程序
3.单步跟踪调试,观察寄存器的变化和指令执行的结果
二、实验环境
硬件环境:一台微型计算机
软件环境:windows xp,debug环境,masm
2.源程序清单
datarea segment;定义数据段
buffer db 80 dup(?) ;预申请了以buffer为首地址的内存单元
flag db ?
datarea ends
prognam segment;定义编码段
main proc far
assume cs:prognam,ds:datarea
(5).初始数据段
(6).分别将AX,BX,CX,SI压栈,保留初始数据,

用汇编语言实现八段数码管显示

用汇编语言实现八段数码管显示

用汇编语言实现八段数码管显示一、实验要求利用实验仪提供的显示电路,动态显示一行数据.二、实验目的1. 了解数码管动态显示的原理。

2. 了解用总线方式控制数码管显示三、实验线路及连线四、实验说明1.本实验仪提供了6 位8段码LED 显示电路,只要按地址输出相应数据,就可以实现对显示器的控制。

显示共有6位,用动态方式显示。

8位段码、6位位码是由两片74LS374输出。

位码经MC1413或ULN2003倒相驱动后,选择相应显示位。

本实验仪中 8位段码输出地址为0X004H ,位码输出地址为 0X002H 。

此处X 是由KEY/LED CS 决定,参见地址译码。

做键盘和LED 实验时,需将KEY/LED CS 接到相应的地址译码上。

以便用相应的地址来访问。

例如,将KEY/LED CS 接到CS0上,则段码地址为08004H ,位码地址为08002H 。

位选通信号 (0x002H)段码输出 (0x004H)数据总线七段数码管的字型代码表如下表:五、程序框图程序代码OUTBIT equ 08002h ; 位控制口OUTSEG equ 08004h ; 段控制口LEDBuf equ 60h ; 显示缓冲Num equ 70h ; 显示的数据DelayT equ 75h ;ljmp StartLEDMAP: ; 八段管显示码db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71hDelay: ;mov r7, #0DelayLoop:djnz r7, DelayLoopdjnz r6, DelayLoopretDisplayLED:mov r0, #LEDBufmov r1, #6 ;mov r2, #00100000b ;Loop:mov dptr, #OUTBITmov a, #0movx @dptr, a ;mov a, @r0mov dptr, #OUTSEGmovx @dptr,amov dptr, #OUTBITmov a, r2movx @dptr, a ;mov r6, #01call Delaymov a, r2 ;rr amov r2, ainc r0djnz r1, Loopmov dptr, #OUTBITmov a, #0movx @dptr, a ;retStart:mov sp, #40hmov Num, #0MLoop:inc Nummov a, Nummov b, amov r0, #LEDBufFillBuf:mov a, banl a, #0fhmov dptr, #LEDMapmovc a, @a+dptr ;mov @r0,a ;inc r0inc bcjne r0, #LEDBuf+6, FillBufmov DelayT,#0DispAgain:call DisplayLED ;djnz DelayT,DispAgain ljmp MLoopend。

汇编语言实验报告

汇编语言实验报告

汇编语言程序设计实验报告东南大学计算机科学与技术学院实验一汇编运行环境及方法、简单程序设计一、程序说明本程序用来比较两个字符串string1和string2所含的字符是否相同。

若相同则显示‘Match’,否则显示‘No match’。

在程序的数据段先定义两个字符串string1和string2,再定义两个字符串mess1和mess2,分别代表‘Match’和‘No match’。

再代码段比较字符串string1和string2,通过比较判断是否相同。

若相同则显示‘Match’,否则显示‘No match’二、调试说明1.在DOS提示符下,进入MASM目录2.在MASM目录下启动EDIT编辑程序,输入源程序,并对其进行汇编、连接和运行。

(1)调用edit输入、编辑源程序并保存在指定目录中(2)用汇编程序MASM对源程序汇编产生目标文件obj。

(3)用连接程序Link产生执行文件exe。

(4)执行程序3.记录每一步所用的命令,以及查看结果的方法和具体结果。

三、源程序清单和debug截图1.实验代码mycode1.asm;PROGRAM TITLE GOES HERE--Compare string;********************************************************* datarea segment ;define data segmentstring1 db 'Move the cursor backward.'string2 db 'Move the cursor backward.'mess1 db 'Match.',13,10,'$'mess2 db 'No match!',13,10,'$'datarea ends;********************************************************* prognam segment ;define code segment;--------------------------------------------------------- main proc farassume cs:prognam,ds:datarea,es:datareastart: ;staring execution address;set up stack for returnpush ds ;save old data segmentsub ax,ax ;put zero in AXpush ax ;save it on stack;set DS register to current data segmentmov ax,datarea ;datarea segment addrmov ds,ax ;into DS registermov es,ax ;into ES register;MAIN PART OF PROGRAM GOES HERElea si,string1lea di,string2cldmov cx,25repz cmpsbjz matchlea dx,mess2jmp short dispmatch:lea dx,mess1disp:mov ah,09int 21hret ;return to DOSmain endp ;end of main part of program;--------------------------------------------------------- prognam ends ;end of code segment;********************************************************* end start ;end assembly2.执行程序结果截图3.运行debug程序。

汇编语言编程实验报告

汇编语言编程实验报告

汇编语言编程实验报告汇编语言编程实验报告学号:姓名:成绩:目录一、实验一: ......................................................错误!未定义书签。

二、实验二: (4)三、实验三: (8)四、实验四: (10)五、实验五: ......................................................错误!未定义书签。

六、实验六: (19)七、汇编实验总结 (23)实验一一.实验题目【汇编语言补充作业T20】编写完整程序,利用DOS系统功能调用,从键盘输入一个字符串,并将该字符串从屏幕上换行后并输出。

二.程序流程及思路实现字符串输入,需要分成三个步骤:1、在数据段中定义一个缓存区为存放字符串做准备;2、DOS系统功能调用0AH号子功能,(DS:DX)= 输入缓冲区首址;3、在输入的字符串尾加上‘$’字符,以作为输出结束条件。

实现字符串输出,则需要注意的问题是:1、缓冲区第三个字节才开始存放输入的字符,前两个字节分别存放缓冲区长度和字符串实际字符数;2、输出回车换行可利用字符串:CR DB 0AH,0DH,’$’。

三.源程序清单DATA SEGMENTN EQU 50MAXLEN DB N ;缓冲区字符的最大长度ACTLEN DB ? ;实际字符个数STRING DB N DUP(?) ;字符空间CR DB 0AH,0DH,'$'DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATAMOV DS,AXLEA DX,MAXLENMOV AH,0AHINT 21H ;字符串输入MOV AH,09HLEA DX,CRINT 21H ;回车换行MOV BL,MAXLEN+1 ;取实际的字符长度MOV BH,0LEA SI,MAXLEN+2 ;取字符开始的首地址MOV BYTE PTR [SI+BX],'$' ;输出结尾要加上$ MOV DX,SI ;把开始存放字符的首地址赋给DX MOV AH,09HINT 21HMOV AH,4CHINT 21HCODE ENDSEND START四.结果拷屏实验二一. 实验题目【汇编语言补充作业T23】假设CX:BX中存放了4为非压缩的BCD码表示的十进制数4386,请编写完整程序将这个数转化成2进制数并存放到DI寄存器中。

汇编语言编程实验报告

汇编语言编程实验报告

汇编语言编程实验报告汇编语言程序设计实验报告(一)汇编语言程序设计实验报告(一)一、预备知识汇编语言程序设计是一门实践性很强的课程。

编写程序、上机调试、运行程序是进一步学习和掌握汇编语言程序设计的必要手段。

二、实验目的1、掌握实验运行汇编语言所用的计算机机型2、熟悉常用编辑程序(行编辑程序EDLIN、全屏幕编辑程序QE及其它用于文件编辑的应用程序。

)3、掌握汇编程序ASM、宏汇编程序MASM1.0以上。

4、LINK连接程序5、DEBUG调试程序三、汇编语言源程序上机操作过程2、编辑源文件根据给定的任务,可编写程序。

如果经过检查认为所编程序无错时,就可在计算机上通过编辑程序建立源程序文件了。

一般在编辑过程中总会有错误产生,因此还要进行人工检查、修改以致重新编辑,直到所编辑的源程序无误为止,然后以一个源程序文件(ASM文件)存盘。

将包含QE文件的工作磁盘插入驱动器A:。

进入QEA\QE进入全屏幕后可以开始编程。

文件名取为Myprog。

asm;Ddisplystring (09H)CODESEGMENTPUBLICASSUME CS:CODE,DS:CODEORG 100HSTART:JMP BEGINMSG DB‘Hi ! This ia a dollar sign terminated string.’,’$’BEGIN:MOV AX,CS ;set up to display messageMOV DS,AXMOV DX,OFFSET,SG ;set up to display messageMOV AH,09H;display string function requestINT 21H ;call DOSMOV AH ,4CH ;terminate propram funct requestINT 21H ;Call DOSCODE ENDS;end of code segmentEND START;strat is the entry point输入完毕后,按ALT---X,存盘返回DOS3、汇编源程序文件(ASM,MASM)由编辑程序所建立的ASM文件只是个文本文件,计算机无法执行。

实验8汇编实验

实验8汇编实验

.实验八编写子程序(4学时)在本次实验中,我们将编写3个子程序,通过它们来认识几个常见的问题和掌握解决这些问题的方法。

同前面的所有实验一样,这个实验室必须独立完成的,在后面的课程中,将要用到这个实验中编写的3个子程序。

1、显示字符串显示字符串是下现实工作中经常要用到的功能,应该编写一个通用的字程序来实现这个功能。

我们应该提供灵活的调用接口,使调用者可以决定显示的位置(行、列)、内容和颜色。

该子程序描述如下:名称:show_str功能:在指定位置用指定颜色显示一个用0结束的字符串。

参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79),(cl)=颜色,ds:si 指向字符串的首地址。

返回:无应用举例:在屏幕的8行3列,用绿色显示data段中的字符串。

assume cs: codedata segmentdb ‘Welcome to masm!’, 0data endscode segmentstart: mov dh, 8mov dl, 3mov cl, 2mov ax, datamov ds, axmov si, 0call show_strmov ax, 4c00hint 21hshow_str: :::code endsend start提示:(1)子程序的入口参数是屏幕上的行号和列号,注意在子程序内部要将它们转化为显存中的地址,首先要分析一下屏幕上的行列位置和显存地址的对应关系;(2)注意保存子程序中用到的相关寄存器;(3)这个子程序的内部处理和显存的结构密切相关,但是向外提供了与显存结构无关的接口。

通过调用这个子程序,进行字符串的显示时可以不必了解显存的结果,为编程提供了方便。

在实验中,注意体会这种设计思想。

. data segmentdb "Welcome to masm!"data endsstack segmentdb "Welcome to masm!"stack endscode segmentstart:mov dh, 8mov dl, 3mov cl, 2mov ax, datamov ds, axmov si, 0mov ax,0B800hmov es,axmov ax, stackmov ss, axmov sp,10hcall show_strmov ax, 4c00hint 21hshow_str:push dxpush cxmov al,160dec dhmul dhmov bx,axadd dx,siadd dl,dladd bl,dlmov cl,[si]mov ch,0jcxz okmov es:[bx],clpop cxmov es:[bx+1],clinc sipop dxjmp short show_strok:pop cxpop dxretcode endsend start2、解决除法溢出的问题前面讲过,div指令可以做除法。

(完整版)汇编语言程序设计实验篇(emu8086),推荐文档

(完整版)汇编语言程序设计实验篇(emu8086),推荐文档

按钮,保存相应的程序段。
2. EXE TEMPLATE 程序
本章与 DOS 功能调用和汇编源程序相关的实验都是用 EXE TEMPLATE 程序完成的。
打开 emu8086,在“welcome…”对话框中,单击
按钮,创ቤተ መጻሕፍቲ ባይዱ文件。
我去人也就有人!为UR扼腕入站内信不存在向你偶同意调剖沙
在“choose code template”对话框中,选择“EXE template-advanced executable
3. 实验原理
通用数据传送指令包括:1)通用数据传送指令,如 MOV,PUSH,POP,XCHG,CBW,CWD;2)目标地址传送指令,如 LDS,LES;3)标志传送指令,如 LAHF,SAHF,PUSHF,POPF;4)输入输出指令,如 IN,OUT,LEA
寻址方式包括:1)立即寻址;2)直接寻址;3)寄存器寻址;4)寄存器间接寻值; 5)寄存器相对寻址;6)基址-变址寻址;7)基址—变址—相对寻址;8)隐含寻址
逻辑运算指令包括:AND,OR,NOT,XOR,TEST
4. 实验内容
(1)创建 COM TEMPLATE 程序,输入以下程序段,单步执行并记录标志位的变化情况
(提示:在 emulator 对话框中,单击
按钮察看标志寄存器的值)。程序段及结果表
格如表 1-2。 表 1-2 算术逻辑运算实验结果表格
标志位 CF ZF SF OF PF AF
4. 实验内容
(1)创建 COM TEMPLATE 程序,输入以下程序段,观察程序的执行情况,程序段如下:
MOV BL,08H
;BX=?
MOV CL,BL
;CL=?
MOV AX,03FFH
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程名称汇编语言与微机原理实验名称中断服务程序的改写
实验目的、要求
1.掌握汇编语言程序设计的编写链接调试运行的完整过程
2.掌握利用masm.exe、link.exe等进行汇编、连接的方法及执行目的程序的方法。

3.掌握中断向量的概念和中断调用的机制。

4.掌握中断服务程序的写法和调用的方法。

实验原理
通过子程序调用和直接写显存的方式将字符串在屏幕的指定位置显示出来。

主要设备
计算机一台汇编语言软件
实验步骤及原始数据记录
程序源代码
1.修改除法错中断的中断服务程序,当发生除法错时,在屏幕的中间显示“overflow”。

assume cs:code
code segment
start: mov ax,cs
mov si,offset do0
mov ax,0
mov es,ax
mov di,200h
mov cx,offset do0end – offset do0
cld
rep movsb
mov ax,0
mov es,ax
mov word ptr es:[0*4],200h
mov word ptr es:[0*4+2],0
mov ax,4c00h
int 21h
do0: jmp short do0start
db “overflow”
do0start: mov ax,cs
mov ds,ax
mov si,202h
mov ax,0b800h
mov es,ax
mov di,12*160 + 36*2
s: mov al,[si]
mov es:[di],al
inc si
add di,2
loop s
mov ax,4c00h
int 21h
do0end : nop
code ends
end start
思考(1)如何直接使用DEBUG命令将该程序编写出来。

四、操作步骤:1.在C盘生成一个新文件夹,例如P1,在该文件夹中拷入masm.exe、link.exe、debug.exe等工具程序
2.打开记事本,将上面的程序复制生成纯文本文件,文件名以.asm为扩展名。

例如:A1.ASM。

(注意保存时要选择保存类型为“所有文件”)。

3.从“开始”→程序→附件→命令提示符,进入DOS命令界面。

4. 使用CD命令,进入新文件夹,例如:P1,命令为:CD C:\P1
5. 执行MASM <文件名>,对源程序进行编译。

6. 执行LINK.EXE <文件名>,连接生成执行程序。

例如:LINK A1
7. 执行生成的程序,将中断服务程序驻留在内存。

8.用DEBUG的A命令输入int 0,然后用G命令执行,屏幕上将显
示字符串“overflow”。

1.程序运行之后,再用DEBUG命令执行int 0,字符串”overflow ”显示出来。

相关文档
最新文档