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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

汇编语言第2版王爽著课后实验报告详解.docx

1、汇编语言第2版王爽著课后实验报告详解 汇编语言实验报告 班级学号学生姓名提交日期成 绩 :实验1-1如下:用E命令将指令写入内存:用A命令将指令写入内存:实验1-2代码如下:用a命令在2000:0000处写如要写如的代码,然后用R命令来修改CS为2000,IP修改为0,然后用T命令执行,直到AX中的值为10,因为是默认为十六进制,所以ax中的0010实际代表十进制的16。如图:实验1-3:用D命令输入内存fff0hfffffh,则可看到:生产日期为06/15/09在地址为FFFF5FFFF12处,现在用E命令随便修改一下有:在window7下虚拟的dos中可以改,但如果重新打开dos中的deb

2、ug则日期任然不会改变,因为那是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

3、,6 ;bx=6026Push ax ;sp=00FE; 修改的内存单元的地址是2200:00FE 内容是5CCAPush bx ;sp=00FC; 修改的内存单元的地址是2200:00FC 内容是 6026Pop ax ;sp=00FE; ax=6026.Pop bx ;sp=0100; bx=.5CCAPush 4 ;sp=00FE; 修改的内存单元的地址是2200:00FE 内容是 30F0Push 6 ;sp=00FC; 修改的内存单元的地址是 2200:00FC内容是 2F36实验截图如下:实验2-2(分析问答实验)答:因为T命令是单步中断,我们在后面学习后知道,CPU执行中断时会保

4、留现场,即将标志寄存器,CS,IP等入栈,而实验中栈的地址正好是要查询的内存地址,所以即便未对内存单元进行写入命令,但里面的值会因为CPU要保留现场自动被改了实验(1)代码: ASSUME CS:CODESCODES SEGMENTSTART: mov ax,2000h mov ss,ax mov sp,0 add sp,10 pop ax pop bx push ax push bx pop ax pop bx MOV AH,4CH INT 21HCODES ENDS END START(2)debug跟踪:(3)用debug跟踪查看PSP中的内容:可见PSP的头两个字节是CD 20,与书上

5、的一致实验4-1代码如下: ASSUME CS:CODESCODES SEGMENTSTART: mov ax,0 mov ds,ax mov bx,200h mov cx,64s: mov bx,al inc al inc bx loop s MOV AH,4CH INT 21HCODES ENDSEND START实验4-1运行图如下:实验4-2代码如下: ASSUME CS:CODESCODES SEGMENTSTART: mov ax,200h mov ds,ax mov bx,0 mov cx,64s: mov bx,bx inc bx loop s MOV AH,4CH INT 2

6、1HCODES ENDS END START运行结果同实验4-1的一样实验4-3(补全代码) ASSUME CS:CODESCODES SEGMENTSTART: mov ax,cs mov ds,ax mov ax,20h mov es,ax mov bx,0 mov cx,16hs: mov al,bx mov es:bx,al inc bx loop s MOV AH,4CH INT 21HCODES ENDSEND START因为要将代码复制到0:200处,则必须知道代码的地址,和代码的长度,代码的地址在cs和IP中,代码的长度可以编译后用U命令查看后确定,这个之前随便打一个数就可以,

7、不影响代码的长度,因为那个数占的空间和真实的长度一样,所以用U命令后在改过来即可实验4-3的运行图如下:实验5-1代码如下:DATAS SEGMENT dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hDATAS ENDSSTACKS SEGMENT dw 0,0,0,0,0,0,0,0STACKS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKSSTART: MOV AX,stacks MOV ss,AX mov sp,16 mov ax,datas mov ds,ax push ds:

8、0 push ds:2 pop ds:2 pop ds:0 MOV AH,4CH INT 21HCODES ENDS END 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:STACKSDATAS SEGMENT dw 0123h,0456h DATAS ENDSSTACKS SEGME

9、NT dw 0,0STACKS ENDSCODES SEGMENTSTART: MOV AX,stacks MOV sS,AX mov sp,16 mov ax,datas mov ds,ax push ds:0 push ds:2 pop ds:2 pop ds:0 MOV AH,4CH INT 21HCODES ENDS END START实验5-2运行图如下:CPU执行程序后,程序返回前,data段中的数据为多少?答:不变如上图CPU执行程序后,程序返回前,CS=144Ch,SS=144Bh,DS=144Ah。设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack

10、段的段地址为X-1.对于如下定义的段:Name segment Name ends如果段中的数据占N个字节,则程序加载后,该段实际占用空间为16N倍。实验5-3代码如下:CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKSSTART: MOV AX,stacks MOV sS,AX mov sp,16 mov ax,datas mov ds,ax push ds:0 push ds:2 pop ds:2 pop ds:0 MOV AH,4CH INT 21HCODES ENDSDATAS SEGMENT dw 0123h,0456hDATAS END

11、SSTACKS SEGMENT dw 0,0STACKS ENDS END 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段的

12、起始位置当作程序代码的开始处,然后一直执行下去,而这三个程序在start前没有其他的内容,去掉start也就不影响期功能了实验5-5代码如下: ASSUME CS:CODESCODES SEGMENT a SEGMENT db 1,2,3,4,5,6,7,8 a ENDSb SEGMENT db 1,2,3,4,5,6,7,8b ENDSCC SEGMENT db 0,0,0,0,0,0,0,0CC ENDSSTART: MOV AX,a MOV DS,AXmov si,0Mov cx,8s: mov ax,0 add al,0+siadd al,16+siMov 32+si,al inc s

13、i loop s MOV AH,4CH INT 21HCODES ENDS END START实验5-5运行图如下:实验5-6代码如下:a SEGMENT dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffha endsb SEGMENT dw 0,0,0,0,0,0,0,0b ENDSCODES SEGMENT ASSUME CS:CODESSTART: MOV AX,a MOV DS,AX mov bx,0 mov ax,b mov ss,ax mov sp,16 mov cx,8s: push bx add bx,2 loop s MOV A

14、H,4CH INT 21HCODES ENDS END START实验5-6运行图如下:实验6代码如下:stacksg SEGMENT dw 0,0,0,0,0,0,0,0stacksg ENDSdatasg SEGMENT db 1. display db 1. brows db 1. replace db 1. modifly datasg ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATASg,SS:STACKSgSTART: MOV AX,DATASg MOV DS,AX mov bx,0 mov ax,stacksg mov ss,ax mov sp,

15、16 mov cx,4s0: push cx mov si,3 mov cx,4s: mov al,bx+si and al,11011111b mov bx+si,al inc si loop s add bx,16 pop cx loop s0 MOV AH,4CH INT 21HCODES ENDS END START实验6运行图如下:实验7代码如下:DATAS SEGMENT Db1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995

16、 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,17800DATAS ENDStable SEGMENT db 21 dup(year summ ne ? )table ENDSCODES SEG

17、MENT ASSUME CS:CODESSTART: MOV AX,DATAS MOV DS,AX mov bp,0 mov ax,table mov es,ax mov di,0 mov bx,0 mov cx,21 ;循环21次,因为有21行s: mov si,0 ;将年份入表mov ax,ds:si+bp ;si是首地址,bp是相对si的偏移地址,bp每次加4 mov es:di,ax mov ax,ds:si+bp+2 mov es:di+2,ax mov si,84 ;将总收入入表 mov ax,ds:si+bp mov es:di+5,ax mov ax,ds:si+bp+2 mo

18、v es:di+7,ax mov si,168 ;将人数入表 mov ax,ds:si+bx ;bx和bp的功能一样,只不过因为它只能每次加2 mov es:di+10,ax mov ax,es:di+5 ;求人均收入并入表 mov dx,es:di+7 div word ptr es:di+10 mov es:di+13,ax add di,16 add bp,4 add bx,2 loop s MOV AH,4CH INT 21HCODES ENDSEND START实验7运行图如下:实验8代码如下:CODES SEGMENT ASSUME CS:CODES mov ax,4c00h in

19、t 21h START: MOV AX,0 s: nop nop mov di,offset s mov si,offset s2 mov ax,cs:si mov cs:di,axso: jmp short ss1: mov ax,0 int 21h mov ax,0s2: jmp short s1 nop CODES ENDSEND START程序能正常执行完毕,因为在start后的第7,8行将s2处的代码写入了s处的两个空字节单元,而内容为EBF0,意思是从将当前IP的值赋成(IP)-F0(八位位移,补码形式),赋值后IP指向了mov ax,4c00h,接着就结束程序了 实验9代码如下:

20、DATAS SEGMENT dbwelcome to masm! DATAS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATASSTART: MOV AX,DATAS MOV DS,AX mov bx,0 mov ax,0b800h mov es,ax mov si,1980 ;将显示的区域定在屏幕中间 mov cx,16s: mov al,bx mov es:si,al mov ah,01110010b ;将颜色定为绿色 mov es:si+1,ah add si,2 inc bx loop s mov bx,0 mov si,2140 ;下一行接着从来 m

21、ov cx,16s1: mov al,bx mov es:si,al mov ah,00100100b ;颜色为绿底红色 mov es:si+1,ah add si,2 inc bx loop s1 mov bx,0 mov si,2300 ;同上 mov cx,16s2: mov al,bx mov es:si,al mov ah,01110001b mov es:si+1,ah add si,2 inc bx loop s2 MOV AH,4CH INT 21HCODES ENDS END START实验9运行图如下:实验10-1代码如下:DATa SEGMENT db welcome t

22、o masm!,0DATA ENDSCODES SEGMENT ASSUME CS:CODESSTART: mov dh,8 mov dl,3 mov cl,2 MOV AX,DATA MOV DS,AX mov si,0 call show_str MOV AH,4CH INT 21Hshow_str: mov ax,data mov ds,ax mov si,0 mov ax,0b800h mov es,ax mov al,160 ; 将乘数(行数)默认放在al中 mul dh ;想乘之后结果放在ax(行的偏移地址)中 mov dh,0 add dl,dl ;因为一个字符用两个字节,所以二

23、倍,及列数的偏移地址 add ax,dx 将列的加到行上就是偏移地址了 mov bx,ax ;bx为偏移地址 s:mov cl,2 mov ch,0 mov al,si mov ah,0 ;开始复制字符到显存中 mov es:bx,al mov es:bx+1,cl ;设置颜色 mov cx,ax inc cx ;判断cx是否为0 jcxz ok inc si add bx,2 loop sok: ret CODES ENDS END START实验10-1运行图如下:实验10-2代码如下:CODES SEGMENT ASSUME CS:CODESSTART: mov ax,4240h mov

24、 dx,00fh mov cx,0ah call divdw MOV AH,4CH INT 21H divdw: mov di,ax ;将ax中的4240先保存起来 mov ax,dx ;将dx中ooof赋给在ax mov dx,0 div cx mov si,dx ; 将余数先存到si中,因为后面马上会占用dx mov dx,ax ;将取商的值赋给dx,这里的dx为高位 push dx mov dx,si ;将余数放入dx中 mov ax,di div cx mov cx,dx pop dx retCODES ENDSEND START实验10-2运行图如下:实验10-3代码如下:DATa1

25、 SEGMENT dw 123,12666,1,8,3,38 DATA1 ENDSdata2 SEGMENT db 16 dup(0)data2 ENDSdata3 segment db 16 dup(0)data3 endsCODES SEGMENT ASSUME CS:CODESSTART: MOV AX,DATA1 MOV DS,AX mov bx,0 mov cx,6 call dtoc ;调用dtoc子程序 mov dh,8 mov dl,3 mov cl,2 mov ch,0 call show_str ;调用show_str子程序 MOV AH,4CH INT 21Hdtoc:

26、mov ax,data2 ;data2中是用来存放字符的,不过是反顺序的“123”在其中变成了“321” mov es,ax mov di,0 mov bp,0s1: push cx ;cx入栈,保存起来 mov ax,bxs2: mov dx,0 ;因为12666%10的结果会溢出,所以有32位当被乘数,ax中存放商 mov cx,10 div cx add dl,30h ;加上30h后就变成ascii对应的字符码了 mov es:di,dl ;存入data2段中 mov cx,ax ;判断商是否为零,为零则结束循环 jcxz ok inc di jmp s2ok: push ds ;因为后

27、面用到ds,而前面又有,所以保存push di sub di,1 ;因为di指向的后一个元素,这里减一使其回到当前元素Mov di,dx ;当前的值保存到dx中 mov ax,data3 ;data2中数据为“3216662118383”,这里将其反置为“1231266618338” mov ds,axs3: mov al,es:dimov ds:bp,al cmp dx,bp ;判断反序复制是否结束的,bp到达原来di所指向的元素则结束 je ok1 inc bp ;反序 dec di jmp s3ok1:add bx,2 pop di ;按顺序还原 pop ds pop cx loop s1 retshow_str: mov ax,data3 ;显示字符的子程序,前面已做过 mov ds,ax mov si,0 mov ax,0b800h mov es,ax mov al,160 mul dh mov dh,0 add dl,dl add ax,dx mov bx,ax s:mov cx,2 mov al,si mov ah,0 mov es:bx,al mov es:bx+1,cl add bx,2 mov cx,ax inc cx inc si loop sok2: ret CODES ENDS END START实验10-3运行图如下:

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

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