当前位置:文档之家› 汇编语言(第2版)王爽著-课后实验报告详解

汇编语言(第2版)王爽著-课后实验报告详解

汇编语言实验报告:班级学号 学生姓名 提交日期成 绩实验1-1如下:用E命令将指令写入内存:用A命令将指令写入内存:实验1-2代码如下:用a命令在2000:0000处写如要写如的代码,然后用R命令来修改CS为2000,IP修改为0,然后用T命令执行,直到AX中的值为10,因为是默认为十六进制,所以ax中的0010实际代表十进制的16。

如图:实验1-3:用D命令输入内存fff0h~fffffh,则可看到:生产日期为06/15/09在地址为FFFF5~FFFF12处,现在用E命令随便修改一下有:在window7下虚拟的dos中可以改,但如果重新打开dos中的debug 则日期任然不会改变,因为那是ROM。

实验1-4代码如下:内存地址为B800:0开始的为显存,是RAM,可以改变其值来在屏幕中显示,其中这一个字符占两个字节,前一个(低)为字符的ASCII 码,后一个(高)为要显示的颜色,内存B800:0和B800:1这两个字节对应着屏幕中的第一个字符的位置,依次类推,每个屏幕的行有80个字符,对应的内存占160个字节实验2-1:(按实验结果填空)Mov ax,ffffMov ds,axMov ax,2200Mov ss,axMov sp,0100Mov ax,[0] ;ax=5BEAAdd ax,[2] ;ax=5CCAMov bx,[4] ;bx=30F0Add bx,[6] ;bx=6026Push ax ;sp=00FE; 修改的内存单元的地址是2200:00FE 内容是5CCA Push bx ;sp=00FC; 修改的内存单元的地址是2200:00FC内容是6026 Pop ax ;sp=00FE; ax=6026.Pop bx ;sp=0100; bx=.5CCAPush [4] ;sp=00FE; 修改的内存单元的地址是2200:00FE内容是30F0 Push [6] ;sp=00FC; 修改的内存单元的地址是2200:00FC内容是2F36 实验截图如下:实验2-2(分析问答实验)答:因为T命令是单步中断,我们在后面学习后知道,CPU执行中断时会保留现场,即将标志寄存器,CS,IP等入栈,而实验中栈的地址正好是要查询的内存地址,所以即便未对内存单元进行写入命令,但里面的值会因为CPU要保留现场自动被改了实验3(1)代码:ASSUME CS:CODES CODES SEGMENT START:mov ax,2000hmov ss,axmov sp,0add sp,10pop axpop bxpush axpush bxpop axpop bxMOV AH,4CHINT 21HCODES ENDSEND START (2)debug跟踪:(3)用debug跟踪查看PSP中的内容:可见PSP的头两个字节是CD 20,与书上的一致实验4-1代码如下:ASSUME CS:CODESCODES SEGMENTSTART:mov ax,0mov ds,axmov bx,200hmov cx,64s: mov [bx],alinc alinc bxloop sMOV AH,4CHINT 21HCODES ENDSEND START实验4-1运行图如下:实验4-2代码如下:ASSUME CS:CODESCODES SEGMENTSTART:mov ax,200hmov ds,axmov bx,0mov cx,64s: mov [bx],bxinc bxloop sMOV AH,4CHINT 21HCODES ENDSEND START运行结果同实验4-1的一样实验4-3(补全代码)ASSUME CS:CODESCODES SEGMENTSTART:mov ax,csmov ds,axmov ax,20hmov es,axmov bx,0mov cx,16hs: mov al,[bx]mov es:[bx],alinc bxloop sMOV AH,4CHINT 21HCODES ENDSEND START因为要将代码复制到0:200处,则必须知道代码的地址,和代码的长度,代码的地址在cs和IP中,代码的长度可以编译后用U命令查看后确定,这个之前随便打一个数就可以,不影响代码的长度,因为那个数占的空间和真实的长度一样,所以用U命令后在改过来即可实验4-3的运行图如下:实验5-1代码如下:DA TAS SEGMENTdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hDA TAS ENDSSTACKS SEGMENTdw 0,0,0,0,0,0,0,0STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DA TAS,SS:STACKSSTART:MOV AX,stacksMOV ss,AXmov sp,16mov ax,datasmov ds,axpush ds:[0]push ds:[2]pop ds:[2]pop ds:[0]MOV AH,4CHINT 21HCODES ENDSEND START实验5-1运行图如下:①CPU执行程序后,程序返回前,data段中的数据为多少?答:不变如上图②CPU执行程序后,程序返回前,CS=144Ch,SS=144Bh,DS=144Ah。

③设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1.实验5-2代码如下:ASSUME CS:CODES,DS:DATAS,SS:STACKSDA TAS SEGMENTdw 0123h,0456hDA TAS ENDSSTACKS SEGMENTdw 0,0STACKS ENDSCODES SEGMENTSTART:MOV AX,stacksMOV sS,AXmov sp,16mov ax,datasmov ds,axpush ds:[0]push ds:[2]pop ds:[2]pop ds:[0]MOV AH,4CHINT 21HCODES ENDSEND START实验5-2运行图如下:①CPU执行程序后,程序返回前,data段中的数据为多少?答:不变如上图②CPU执行程序后,程序返回前,CS=144Ch,SS=144Bh,DS=144Ah。

③设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1.④对于如下定义的段:Name segment……Name ends如果段中的数据占N个字节,则程序加载后,该段实际占用空间为16N倍。

实验5-3代码如下:CODES SEGMENTASSUME CS:CODES,DS:DA TAS,SS:STACKSSTART:MOV AX,stacksMOV sS,AXmov sp,16mov ax,datasmov ds,axpush ds:[0]push ds:[2]pop ds:[2]pop ds:[0]MOV AH,4CHINT 21HCODES ENDSDA TAS SEGMENTdw 0123h,0456hDA TAS ENDSSTACKS SEGMENTdw 0,0STACKS ENDSEND START实验5-3运行图如下:①CPU执行程序后,程序返回前,data段中的数据为多少?答:不变如上图②CPU执行程序后,程序返回前,CS=144Ch,SS=144Eh,DS=144Dh。

③设程序加载后,code段的段地址为X,则data段的段地址为X+3,stack段的段地址为X+4。

实验5-4:如果将(1),(2),(3)题中的最后一条伪指令“end start”改为“end”(也就是说,不指明程序的入口),则哪个程序任然可以正确执行?答:程序都可以正确执行,因为去掉start后,由于没有的标志,系统会将从code段的起始位置当作程序代码的开始处,然后一直执行下去,而这三个程序在start前没有其他的内容,去掉start也就不影响期功能了实验5-5代码如下:ASSUME CS:CODESCODES SEGMENTa SEGMENTdb 1,2,3,4,5,6,7,8a ENDSb SEGMENTdb 1,2,3,4,5,6,7,8b ENDSCC SEGMENTdb 0,0,0,0,0,0,0,0CC ENDSSTART:MOV AX,aMOV DS,AXmov si,0Mov cx,8s: mov ax,0add al,[0+si]add al,[16+si]Mov [32+si],alinc siloop sMOV AH,4CHINT 21HCODES ENDSEND START实验5-5运行图如下:实验5-6代码如下:a SEGMENTdw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffha endsb SEGMENTdw 0,0,0,0,0,0,0,0b ENDSCODES SEGMENTASSUME CS:CODESSTART:MOV AX,aMOV DS,AXmov bx,0mov ax,bmov ss,axmov sp,16mov cx,8s: push [bx]add bx,2loop sMOV AH,4CHINT 21HCODES ENDSEND START实验5-6运行图如下:实验6代码如下:stacksg SEGMENTdw 0,0,0,0,0,0,0,0stacksg ENDSdatasg SEGMENTdb '1. display 'db '1. brows 'db '1. replace 'db '1. modifly 'datasg ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASg,SS:STACKSg START:MOV AX,DATASgMOV DS,AXmov bx,0mov ax,stacksgmov ss,axmov sp,16mov cx,4s0: push cxmov si,3mov cx,4s: mov al,[bx+si]and al,11011111bmov [bx+si],alinc siloop sadd bx,16pop cxloop s0MOV AH,4CHINT 21HCODES ENDSEND START实验6运行图如下:实验7代码如下:DA TAS SEGMENTDb'1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985','1986','1987','1988','198 9','1990','1991','1992','1993','1994','1995'dd 16,22,382,1356,2390,8000,16000,24486,50065,97497,140417,197514dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226dw 11542,11430,15257,17800DA TAS ENDStable SEGMENTdb 21 dup('year summ ne ?? ')table ENDSCODES SEGMENTASSUME CS:CODESSTART:MOV AX,DATASMOV DS,AXmov bp,0mov ax,tablemov es,axmov di,0mov bx,0mov cx,21 ;循环21次,因为有21行s: mov si,0 ;将年份入表mov ax,ds:[si+bp] ;si是首地址,bp是相对si的偏移地址,bp每次加4mov es:[di],axmov ax,ds:[si+bp+2]mov es:[di+2],axmov si,84 ;将总收入入表mov ax,ds:[si+bp]mov es:[di+5],axmov ax,ds:[si+bp+2]mov es:[di+7],axmov si,168 ;将人数入表mov ax,ds:[si+bx] ;bx和bp的功能一样,只不过因为它只能每次加2 mov es:[di+10],axmov ax,es:[di+5] ;求人均收入并入表mov dx,es:[di+7]div word ptr es:[di+10]mov es:[di+13],axadd di,16add bp,4add bx,2loop sMOV AH,4CHINT 21HCODES ENDSEND START实验7运行图如下:实验8代码如下:CODES SEGMENTASSUME CS:CODESmov ax,4c00hint 21hSTART:MOV AX,0s: nopnopmov di,offset smov si,offset s2mov ax,cs:[si]mov cs:[di],axso: jmp short ss1: mov ax,0int 21hmov ax,0s2: jmp short s1nopCODES ENDSEND START程序能正常执行完毕,因为在start后的第7,8行将s2处的代码写入了s处的两个空字节单元,而内容为EBF0,意思是从将当前IP 的值赋成(IP)-F0(八位位移,补码形式),赋值后IP指向了mov ax,4c00h,接着就结束程序了实验9代码如下:DA TAS SEGMENTdb'welcome to masm!'DA TAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DA TASSTART:MOV AX,DATASMOV DS,AXmov bx,0mov ax,0b800hmov es,axmov si,1980 ;将显示的区域定在屏幕中间mov cx,16s: mov al,[bx]mov es:[si],almov ah,01110010b ;将颜色定为绿色mov es:[si+1],ahadd si,2inc bxloop smov bx,0mov si,2140 ;下一行接着从来mov cx,16s1: mov al,[bx]mov es:[si],almov ah,00100100b ;颜色为绿底红色mov es:[si+1],ahadd si,2inc bxloop s1mov bx,0mov si,2300 ;同上mov cx,16s2: mov al,[bx]mov es:[si],almov ah,01110001bmov es:[si+1],ahadd si,2inc bxloop s2MOV AH,4CHINT 21HCODES ENDSEND START实验9运行图如下:实验10-1代码如下:DA Ta SEGMENTdb 'welcome to masm!',0DA TA ENDSCODES SEGMENTASSUME CS:CODESSTART:mov dh,8mov dl,3mov cl,2MOV AX,DATAMOV DS,AXmov si,0call show_strMOV AH,4CHINT 21Hshow_str:mov ax,datamov ds,axmov si,0mov ax,0b800hmov es,axmov al,160 ; 将乘数(行数)默认放在al中mul dh ;想乘之后结果放在ax(行的偏移地址)中mov dh,0add dl,dl ;因为一个字符用两个字节,所以二倍,及列数的偏移地址add ax,dx 将列的加到行上就是偏移地址了mov bx,ax ;bx为偏移地址s:mov cl,2mov ch,0mov al,[si]mov ah,0 ;开始复制字符到显存中mov es:[bx],almov es:[bx+1],cl ;设置颜色mov cx,axinc cx ;判断cx是否为0jcxz okinc siadd bx,2loop sok: retCODES ENDSEND START实验10-1运行图如下:实验10-2代码如下:CODES SEGMENTASSUME CS:CODESSTART:mov ax,4240hmov dx,00fhmov cx,0ahcall divdwMOV AH,4CHINT 21Hdivdw:mov di,ax ;将ax中的4240先保存起来mov ax,dx ;将dx中ooof赋给在axmov dx,0div cxmov si,dx ; 将余数先存到si中,因为后面马上会占用dx mov dx,ax ;将取商的值赋给dx,这里的dx为高位push dxmov dx,si ;将余数放入dx中mov ax,didiv cxmov cx,dxpop dxretCODES ENDSEND START实验10-2运行图如下:实验10-3代码如下:DA Ta1 SEGMENTdw 123,12666,1,8,3,38DA TA1 ENDSdata2 SEGMENTdb 16 dup(0)data2 ENDSdata3 segmentdb 16 dup(0)data3 endsCODES SEGMENTASSUME CS:CODESSTART:MOV AX,DATA1MOV DS,AXmov bx,0mov cx,6call dtoc ;调用dtoc子程序mov dh,8mov dl,3mov cl,2mov ch,0call show_str ;调用show_str子程序MOV AH,4CHINT 21Hdtoc:mov ax,data2 ;data2中是用来存放字符的,不过是反顺序的“123”在其中变成了“321”mov es,axmov di,0mov bp,0s1: push cx ;cx入栈,保存起来mov ax,[bx]s2: mov dx,0 ;因为12666%10的结果会溢出,所以有32位当被乘数,ax中存放商mov cx,10div cxadd dl,30h ;加上30h后就变成ascii对应的字符码了mov es:[di],dl ;存入data2段中mov cx,ax ;判断商是否为零,为零则结束循环jcxz okinc dijmp s2ok: push ds ;因为后面用到ds,而前面又有,所以保存push disub di,1 ;因为di指向的后一个元素,这里减一使其回到当前元素Mov di,dx ;当前的值保存到dx中mov ax,data3 ;data2中数据为“3216662118383”,这里将其反置为“1231266618338”mov ds,axs3: mov al,es:[di]mov ds:[bp],alcmp dx,bp ;判断反序复制是否结束的,bp到达原来di所指向的元素则结束je ok1inc bp ;反序dec dijmp s3ok1:add bx,2pop di ;按顺序还原pop dspop cxloop s1retshow_str:mov ax,data3 ;显示字符的子程序,前面已做过mov ds,axmov si,0mov ax,0b800hmov es,axmov al,160mul dhmov dh,0add dl,dladd ax,dxmov bx,axs:mov cx,2mov al,[si]mov ah,0mov es:[bx],almov es:[bx+1],cladd bx,2mov cx,axinc cxinc siloop sok2: retCODES ENDSEND START实验10-3运行图如下:。

相关主题