汇编语言(第2版)王爽著-课后实验报告详解
汇编语言(王爽)_第二版_课后题全_答案25
0000:0203 8ED8 MOV DS,AX0000:0205 B82000 MOV AX,00200000:0208 8EC0 MOV ES,AX0000:020A BB0000 MOV BX,00000000:020D B91800 MOV CX,00180000:0210 8A07 MOV AL,[BX]0000:0212 26 ES:0000:0213 8807 MOV [BX],AL0000:0215 43 INC BX0000:0216 E2F8 LOOP 02100000:0218 0000 ADD [BX+SI],AL0000:021A 0000 ADD [BX+SI],AL0000:021C 0000 ADD [BX+SI],AL0000:021E 0000 ADD [BX+SI],AL-q检测点6.1(1) 下面的程序实现依次用内存0:0~0:15单元中的内容改写程序中的数据,完成程序:assume cs:codesgcodesg segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hstart: mov ax,0mov ds,axmov bx,0mov cx,8s: mov ax,[bx]mov cs:[bx],axadd bx,2loop smov ax,4c00hint 21hcodesg endsend start(2) 下面的程序实现依次用内存0:0~0:15单元中的内容改写程序中的数据,数据的传送用栈来进行。
栈空间设置在程序内。
完成程序:assume cs:codesgcodesg segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hdw 0,0,0,0,0,0,0,0,0,0 ;10个字单元用栈空间start:mov ax,csmov ss,axmov sp,36mov ax,0mov ds,axmov bx,0mov cx,8s:push [bx]pop cs:[bx]add bx,2loop smov ax,4c00hint 21hcodesg endsend start实验5 编写、调试具有多个段的程序(1) 将下面的程序编译连接,用Debug加载、跟踪,然后回答问题assume cs:code,ds:data,ss:stackdata segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hdata endsstack segmentdw 0,0,0,0,0,0,0,0stack endscode segmentstart: mov ax,stackmov ss,axmov sp,16mov ax,datamov ds,axpush ds:[0]push ds:[2]pop ds:[2]pop ds:[0]mov ax,4c00hint 21hcode endsend start① CPU执行程序,程序返回前,data段中的数据为多少?解:不变② CPU执行程序,程序返回前,cs=155ch、ss=155bh、ds=155ah。
汇编语言(王爽)_第二版_课后题全_答案18
0C1C:0124 push [6]0C1C:0128-rAX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0100 NV UP EI PL NZ NA PO NC 0C1C:0100 B8FFFF MOV AX,FFFF-tAX=FFFF BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0103 NV UP EI PL NZ NA PO NC 0C1C:0103 8ED8 MOV DS,AX-tAX=FFFF BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=FFFF ES=0C1C SS=0C1C CS=0C1C IP=0105 NV UP EI PL NZ NA PO NC 0C1C:0105 B80022 MOV AX,2200-tAX=2200 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=FFFF ES=0C1C SS=0C1C CS=0C1C IP=0108 NV UP EI PL NZ NA PO NC 0C1C:0108 8ED0 MOV SS,AX-tAX=2200 BX=0000 CX=0000 DX=0000 SP=0100 BP=0000 SI=0000 DI=0000 DS=FFFF ES=0C1C SS=2200 CS=0C1C IP=010D NV UP EI PL NZ NA PO NC 0C1C:010D A10000 MOV AX,[0000] DS:0000=5BEA-d ffff:0 fFFFF:0000 EA 5B E0 00 F0 31 32 2F-32 35 2F 30 37 00 FC 59 .[...12/25/07..Y-tAX=5BEA BX=0000 CX=0000 DX=0000 SP=0100 BP=0000 SI=0000 DI=0000 DS=FFFF ES=0C1C SS=2200 CS=0C1C IP=0110 NV UP EI PL NZ NA PO NC 0C1C:0110 03060200 ADD AX,[0002] DS:0002=00E0-tAX=5CCA BX=0000 CX=0000 DX=0000 SP=0100 BP=0000 SI=0000 DI=0000 DS=FFFF ES=0C1C SS=2200 CS=0C1C IP=0114 NV UP EI PL NZ NA PE NC 0C1C:0114 8B1E0400 MOV BX,[0004] DS:0004=31F0-tAX=5CCA BX=31F0 CX=0000 DX=0000 SP=0100 BP=0000 SI=0000 DI=0000 DS=FFFF ES=0C1C SS=2200 CS=0C1C IP=0118 NV UP EI PL NZ NA PE NC。
王爽汇编语言综合研究实验报告
王爽《汇编语言(第 2 版)》综合研究实验报告
研究试验 4 不用main函数的编程
1 对程序 f.()的问题 该程序在连接阶段出现问题如下图
出错信息与 c0s.obj 有关。为什么会有关?? 将 c0s.obj 用 link 连接用 debug 查看汇编代码,与有 main 函数的程序一一对比发现
在 TC2.0 打安装目录中,有很多文件和子目录,子目录下面还有很多文件和程序,这些 程序实际上有很多都是不必要的。那么我们怎么搭建一个简单的 C 语言开发环境,怎样判 断哪些文件是我们一定要用的呢?
为了使研究过程清晰明了,我们要遵循两个原则:1、我们只运行解决当前问题要用的 一致程序;2、我们已知的程序在解决问题的运行过程中,需要用到的程序和文件,也都是 我们已知的。
8
王爽《汇编语言(第 2 版)》综合研究实验报告
查看 dx 和 ax 的值
将 dx*10000H+AX 的值则刚好为 12 的阶乘,这说明函数返回值是 AX 和 DX 返回的。 Malloc 用法: #define Buffer ((char*)*(int far*)0x02000000) main() {
11
王爽《汇编语言(第 2 版)》综合研究实验报告
发现先执行的是我们编写的 c0s.asm 代码 新的 c0s 是如何找到我们的程序的? 因为我们自己写的程序总是连接在 c0s.obj 文件后面,也就是此处的 s 标号后面,所以 call s 也就是调用我们的程序了。 新的 main 函数的偏移地址是不是都为 1fa? 不是的,新生成的 c0s.obj 调用的是第一个函数的偏移地址不一定是 1fa。 3 在新 cos.obj 的基础上,写一个新的 f.c,向安全空间写入”a”到”z”8 个字符。
汇编语言王爽第二版课后答案培训资料
汇编语言王爽第二版课后答案第一章基础知识检测点1.1(第8页)----------------------(1) 13(2) 1024,0,1023(3) 8192,1024(4) 2^30,2^20,2^10(5) 64,1,16,4(6) 1,1,2,2,4(7) 512,256(8) 二进制注意:1.第4题中的符号'^'指求幂运算(如: 2^30指2的30次方)第二章寄存器(CPU工作原理)检测点2.1(第18页)----------------------(1)写出每条汇编指令执行后相关寄存器中的值。
第一空:F4A3H第二空:31A3H第三空:3123H第四空:6246H第五空:826CH第六空:6246H第七空:826CH第八空:04D8H第九空:0482H第十空:6C82H第十一空:D882H第十二空:D888H第十三空:D810H第十四空:6246H(2)只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方。
解答如下:mov ax,2add ax,axadd ax,axadd ax,ax检测点2.2(第23页)----------------------(1)00010H,1000FH(2)1001H,2000H第2题说明:因为段的起始地址要为16的倍数。
所以当段地址小于1001H或大于2000H时CPU都无法寻到。
检测点2.3(第33页)----------------------答:CPU修改了4次IP的值。
情况如下:第1次:执行完mov ax,bx后第2次:执行完sub ax,ax后第3次:读入jmp ax后第4次:执行完jmp ax后最后IP的值为0实验1 查看CPU和内存,用机器指令和汇编指令编程(第33页)-----------------------------------------------------1.预备知识:Debug的使用<此部分略>2.实验任务(第43页)(1)<此部分略>(2)<此部分略>(3)通过DEBUG中的D命令查看到主板的生产日期[以月、日、年,分隔符为'/'的格式]存储在内存ffff:0005~ffff:000C(共8个字节单元中)处。
汇编语言王爽第二版课后答案
(1) 13⑵ 1024,0,1023(3) 8192,1024(4) 2A 30,2A 20,2A 10(5) 64,1,16,4(6) 1,1,2,2,4(7) 512,256(8) 二进制 注意:1.第4题中的符号'A'指求幂运算(如:2A30指2的 30次方)第二章寄存器(CPU 工作原理)检测点(第18页)检测点(第8页)(1)写岀每条汇编指令执行后相关寄存器中的值。
第一空:F4A3H第二空:31A3H第三空:3123H 第六空:6246H第七空:826CH第八空:04D8H第九空:0482H第十空:6C82H第 ^一空:D882H第十二空:D888H第十三空:D810H第十四空:6246H(2)只能使用目前学过的汇编指令,最多使用 指令,编程计算2的4次方。
解答如下:mov ax,2add ax,axadd ax,axadd ax,ax检测点(第23页)(1)00010H,1000FH第四空:6246H第2题说明:因为段的起始地址要为16的倍数。
所以当段地址小于1001H或大于2000H时CPL都无法寻到。
检测点(第33页)答:CPU修改了4次IP的值。
情况如下:第1次:执行完mov ax,bx 后第2次:执行完sub ax,ax 后第3次:读入jmp ax后第4次:执行完jmp ax后最后IP的值为0实验1查看CPU和内存,用机器指令和汇编指令编程(第33页)1. 预备知识:Debug的使用<此部分略>2. 实验任务(第43页)(1)<此部分略><此部分略>通过DEBUGS的D命令查看到主板的生产日期[以月、日、年,分隔符为'/'的格式]存储在内存ffff:0005〜ffff:000C(共8个字节单元中)处。
此生产日期不能被改变,因为其具有’只读’属性。
⑷通过向内存中的显存写入数据,使计算机根据写入的数据进行ASCII转换,并将转换后且可打印的字符输岀到屏幕上。
汇编语言第二版王爽完整答案(供参考)
第1章基础知识检测点1.1(1)1个CPU的寻址能力为8KB,那么它的地址总线的宽度为13。
(2)1KB的存储器有1024个存储单元。
存储单元的编号从0到1023。
(3)1KB的存储器可以存储1024*8个bit,1024个Byte。
(4)1GB、1MB、1KB分别是2^30、2^20、2^10 Byte。
(n^m的意思是n的m次幂)(5)8080、8088、80286、80386的地址总线宽度分别是16根、20根、24根、32根,则它们的寻址能力分别为:64(KB)、1(MB)、16(MB)、4(GB)。
(6)8080、8088、8086、80286、80386的数据总线宽度分别为8根、8根、16根、16根、32根。
则它们一次可以传送的数据为:1(B)、1(B)、2(B)、2(B)、4(B)。
(7)从内存中读取1024字节的数据,8086至少要读512次、80386至少要读256次。
(8)在存储器中,数据和程序以二进制形式存放。
第2章寄存器答案检测点2.1(1) 写出每条汇编指令执行后相关寄存器中的值。
mov ax,62627 AX=F4A3Hmov ah,31H AX=31A3Hmov al,23H AX=3123Hadd ax,ax AX=6246Hmov bx,826CH BX=826CHmov cx,ax CX=6246Hmov ax,bx AX=826CHadd ax,bx AX=04D8Hmov al,bh AX=0482Hmov ah,bl AX=6C82Hadd ah,ah AX=D882Hadd al,6 AX=D888Hadd al,al AX=D810Hmov ax,cx AX=6246H(2) 只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方。
解:mov ax,2add ax,axadd ax,axadd ax,ax检测点2.2(1) 给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围为00010H到1000FH。
汇编语言 第二版 王爽 完整答案
第1章基础知识检测点1.1(1)1个的寻址能力为8,那么它的地址总线的宽度为13。
(2)1的存储器有1024个存储单元。
存储单元的编号从0到1023。
(3)1的存储器可以存储1024*8个,1024个。
(4)1、1、1分别是2^30、2^20、2^10。
(n^m的意思是n的m次幂)(5)8080、8088、80286、80386的地址总线宽度分别是16根、20根、24根、32根,则它们的寻址能力分别为:64()、1()、16()、4()。
(6)8080、8088、8086、80286、80386的数据总线宽度分别为8根、8根、16根、16根、32根。
则它们一次可以传送的数据为:1(B)、1(B)、2(B)、2(B)、4(B)。
(7)从内存中读取1024字节的数据,8086至少要读512次、80386至少要读256次。
(8)在存储器中,数据和程序以二进制形式存放。
第2章寄存器答案检测点2.1(1) 写出每条汇编指令执行后相关寄存器中的值。
,62627 4A3H,31H 31A3H,23H 3123H6246H,826 8266246H82604D8H0482H6C82H882H,6 888H810H6246H(2) 只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方。
解:,2检测点2.2(1) 给定段地址为0001H,仅通过变化偏移地址寻址,的寻址范围为00010H到1000。
(2) 有一数据存放在内存 20000H 单元中,先给定段地址为,若想用偏移地址寻到此单元。
则应满足的条件是:最小为1001H,最大为2000H。
检测点2.3下面的3条指令执行后,几次修改?都是在什么时候?最后中的值是多少?解:修改4次;第一次在读取“ ”后,第二次在读取“ ”后,第三次在读取“ ”后,第四次在执行完“ ”后;最后中的值为0。
实验1 查看和内存,用机器指令和汇编指令编程1.略2.(1)略(2)略(3)查看内存中的内容。
汇编语言(王爽)_第二版_课后题全_答案5
DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0100 NV UP EI PL NZ NA PO NC0C1C:0100 B80200 MOV AX,0002-tAX=0002 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0103 NV UP EI PL NZ NA PO NC0C1C:0103 01C0 ADD AX,AX-tAX=0004 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0105 NV UP EI PL NZ NA PO NC0C1C:0105 01C0 ADD AX,AX-tAX=0008 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0107 NV UP EI PL NZ NA PO NC0C1C:0107 01C0 ADD AX,AX-tAX=0010 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0109 NV UP EI PL NZ AC PO NC0C1C:0109 20881615 AND [BX+SI+1516],CL DS:1516=00-q检测点2.2(1) 给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围为 0010H 到 1000FH 。
解题过程:物理地址=SA*16+EAEA的变化范围为0h~ffffh物理地址范围为(SA*16+0h)~(SA*16+ffffh)现在SA=0001h,那么寻址范围为(0001h*16+0h)~(0001h*16+ffffh)=0010h~1000fh检测点2.2(2) 有一数据存放在内存20000H单元中,现给定段地址为SA,若想用偏移地址寻到此单元。
汇编语言(第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。
王爽汇编实验
王爽汇编实验是一项重要的实验课程,旨在让学生通过实际操作来深入理解计算机汇编语言的原理和应用。
在这个实验中,学生将学习如何使用汇编语言来编写简单的程序,并通过调试和优化来提高程序的效率和性能。
下面将详细介绍王爽汇编实验的内容和实施过程。
一、实验目的1. 掌握计算机汇编语言的基本原理和理论知识。
2. 熟悉汇编语言的基本语法和命令。
3. 学会使用汇编语言编写简单的程序。
4. 掌握程序的调试和优化方法,提高程序的效率和性能。
二、实验内容1. 汇编语言的基本概念和原理2. 汇编语言的基本语法和命令3. 汇编语言的程序设计4. 程序的调试和优化方法三、实验过程1. 学生首先需要理解汇编语言的基本概念和原理,包括计算机的指令集和操作原理等。
老师可以通过讲解和示范来帮助学生理解这些概念。
2. 然后,学生需要学习汇编语言的基本语法和命令。
他们可以通过阅读教材和参考资料来学习这些知识,并通过实际操作来加深理解。
3. 接下来,学生将学习如何使用汇编语言来编写简单的程序。
他们可以从简单的加减乘除运算开始,逐渐扩展到更复杂的程序设计。
4. 最后,学生将学习如何调试和优化程序。
他们可以通过排查程序中的错误和优化算法来提高程序的效率和性能。
四、实验要求1. 学生需要认真学习汇编语言的相关知识,包括基本概念、语法和命令等。
2. 学生需要认真完成实验内容,并及时向老师汇报实验进展。
3. 学生需要认真总结实验经验,包括遇到的问题、解决的方法和收获的经验等。
通过王爽汇编实验,学生可以深入理解计算机汇编语言的原理和应用,掌握程序设计的基本技能,并提高程序的调试和优化能力。
这些知识和技能将对学生今后的学习和工作产生重要的影响。
因此,王爽汇编实验是一项非常重要的实验课程,值得学生认真对待。
王爽汇编语言第二版全部
王爽汇编语言第二版全部汇编语言是计算机体系结构的重要组成部分,它是一种低级的计算机语言,用于编写和控制计算机程序。
王爽的《汇编语言》第二版是学习汇编语言的经典教材,全面介绍了汇编语言的基本概念、语法、指令集等内容。
本文将对王爽汇编语言第二版的全部内容进行汇总和归纳,以便读者更好地理解和掌握汇编语言。
第一章:计算机系统概述王爽的《汇编语言》第二版从计算机系统概述开始,为读者介绍了计算机的发展历程、计算机的基本组成以及计算机的工作原理。
本章包括了计算机硬件、计算机软件、计算机系统结构和指令执行的基本概念。
第二章:汇编语言的基本概念在本章中,王爽详细介绍了汇编语言的基本概念,包括机器语言、汇编语言、汇编过程和编程方法。
他还介绍了汇编程序的基本结构、程序设计的基本原则以及一些常用的汇编指令。
第三章:x86处理器本章主要介绍了x86处理器的基本特征、寄存器、指令格式和地址寻址方式。
王爽通过详细解释和示例代码让读者了解x86处理器的内部结构和工作原理。
第四章:汇编语言程序设计基础在这一章节中,王爽介绍了汇编语言程序设计的基础知识,包括数据的表示和操作、常用的数据转移和运算指令、程序的循环和分支控制等内容。
通过实际例子和练习,读者可以掌握汇编语言程序设计的基本技巧和方法。
第五章:中断和异常处理该章节详细讲解了中断和异常处理的概念和原理。
王爽介绍了中断和异常的分类、中断向量表的结构和使用方法,以及中断处理程序的编写和调用。
第六章:8086汇编语言程序的转移与操作本章主要介绍了8086汇编语言程序的转移和操作指令。
王爽通过示例和实践让读者了解和掌握如何编写和调试8086汇编程序。
第七章:8086汇编语言程序的子程序设计在这一章中,王爽详细介绍了8086汇编语言中子程序的概念、设计和调用方法。
他还介绍了如何使用栈来传递参数和保存返回地址,以及如何处理函数的局部变量。
第八章:输入/输出编程该章节涵盖了输入/输出编程的基本知识和技巧。
王爽汇编语言综合研究一实验报告
综合研究一研究报告一、研究步骤如下:1、进入DOS系统,在d盘下建立一个文件目录,将tc2.0的所有文件都剪切到这个新建的目录下:md d:\tc2.0然后将tc2.0的所有文件都拷贝在d:\tc2.0目录下2、在C盘建立一个minic目录:mdc:\minic思考:为什么还要在D盘新建一个目录呢,而不直接在安装目录中拷贝?解决:因为一般的产品软件系统都可以在安装的时候设置搜索路径让系统在相关文件不在同一目录下也可以找到相关文件。
这样会使我们及时c:\minic下诶有相关文件,而系统也可以找到它,是程序正常编译连接。
所以,我们可以通过两种方法解决:①不让设置的默认路径指向包含相关文件的目录(即改变path设置);②把文件剪切到系统搜索不到的目录中。
我们上面就是用的第二种方法.3、将tc.exe拷贝到c:\minic下:copy d:tc2.0\tc.exe c:\minic4、运行tc.exe :tc将tc的工作路径都清空,并保存。
5、在tc.exe中编辑zhyj1.c程序,保存到c:\minic下:程序如下:Main(){printf(“hello world!\n”);}6、编译程序,结果显示成功7、运行程序,不成功,缺少文件,经过反复运行,缺少的文件如下:8、将所缺少的文件复制到c:\minic9、编译程序二、书本上出现的问题:1. 在tc2.0的安装目录下会有很多文件和很多子目录,这些文件和子目录我们写程序的时候都需要用到吗?2. 这些文件和子目录会对我们研究结果造成影响吗?3. 如果这些文件会对我们的研究的结果会造成影响,那么究竟是哪个文件造成的呢,我们又怎么能找到那些对我们研究结果造成影响的程序和文件呢?答案:1.不需要,只用到解决当前问题所要用到的我们已知的程序2.这些文件中只有对我们有用的文件才会对我们的程序造成影响其他的没有影响。
3. 一般的产品软件系统,都可以在安装的时候设置搜索路径让系统在相关文件不在同一目录下,也可以找到相关文件。
王爽汇编语言综合研究实验报告
王爽《汇编语言(第 2 版)》综合研究实验报告
发现先执行的是我们编写的 c0s.asm 代码 新的 c0s 是如何找到我们的程序的? 因为我们自己写的程序总是连接在 c0s.obj 文件后面,也就是此处的 s 标号后面,所以 call s 也就是调用我们的程序了。 新的 main 函数的偏移地址是不是都为 1fa? 不是的,新生成的 c0s.obj 调用的是第一个函数的偏移地址不一定是 1fa。 3 在新 cos.obj 的基础上,写一个新的 f.c,向安全空间写入”a”到”z”8 个字符。
db 128 dup(0) data ends code segment
start : mov ax,data mov ds,ax mov ss,ax mov sp,128 call s mov ax,4c00h int 21h
s: code ends
end start 这里我们定义了一个数据段和栈段。用 masm.exe 编译,将生成的 c0s.obj 放在 minic 目 录下,用 tc 连接 f.c 生成 f.exe.使用 debug 查看代码:
运行结果如下:
4、于是,我们知道了 main 函数的偏移地址,可以进行步骤 2 了:
0D1A:01FA 55
PUSH BP
0D1A:01FB 8BEC
MOV BP,SP
思考:这两句是什么意思呢?我们在 C 程序中并没有相关语句啊。
4
王爽《汇编语言(第 2 版)》综合研究实验报告
解答:因为 main 函数也相当于汇编中的一个子程序,我们要在调用子程序时将栈顶位置保 存,以便子程序能正确返回,而栈顶指针 sp 不能当做偏移地址移动,所以将 sp 赋给 bp。
在这个程序中,函数声明成了 void showchar(int,int,...),参数一传入了一个字符的数量, 参数二传入显示的颜色,参数三开始传入要显示的字符。函数通过参数一来控制显示字符的 循环次数,通过这种方式来接收多个参数。
汇编语言王爽课后答案
汇编语言王爽课后答案【篇一:汇编语言课后习题答案王爽主编】一个值为0的字节,找到后,将它的偏移地址存储在dx中。
assume cs:codecode segmentstart: mov ax,2000hmov ds,axmov bx,0s: mov ch,0 mov cl,[bx] jcxz ok;当cx=0时,cs:ip指向okinc bxjmp short sok: mov dx,bxmov ax ,4c00hint 21hcode endsend start检测点9.3补全编程,利用loop指令,实现在内存2000h段中查找第一个值为0的字节,找到后,将它的偏移地址存储在dx中。
assume cs:codecode segmentstart: mov ax,2000hmov ds,axmov bx,0s:mov cl,[bx]mov ch,0 inc cxinc bxloop sok:dec bxmov dx,bxmov ax,4c00hint 21hcode endsend start书p101,执行loop s时,首先要将(cx)减1。
“loop 标号”相当于dec cxif((cx)≠0) jmp short 标号检测点10.1补全程序,实现从内存1000:0000处开始执行指令。
assume cs:codestack segmentdb 16 dup (0)stack endscode segmentstart: mov ax,stackmov ss,axmov sp,16mov ax, 1000hmov ax,0push axretfcode endsend start执行reft指令时,相当于进行:pop ippop cs根据栈先进后出原则,应先将段地址cs入栈,再将偏移地址ip入栈。
检测点10.3下面的程序执行后,ax中的数值为多少?内存地址机器码汇编指令执行后情况1000:0 b8 00 00 mov ax,0 ax=0,ip指向1000:31000:3 9a 09 00 00 10 call far ptr s pop cs,pop ip,ip指向1000:91000:8 40 inc ax1000:9 58 s:pop ax ax=8hadd ax,ax ax=10hpop bx bx=1000hadd ax,bx ax=1010h用debug进行跟踪确认,“call far ptr s”是先将该指令后的第一个字节段地址cs=1000h入栈,再将偏移地址ip=8h入栈,最后转到标号处执行指令。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
汇编语言实验报告:班级学号 学生姓名 提交日期成 绩实验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运行图如下:。