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

合集下载

汇编语言(王爽)_第二版_课后题全_答案25

汇编语言(王爽)_第二版_课后题全_答案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

汇编语言(王爽)_第二版_课后题全_答案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。

王爽汇编语言综合研究实验报告

王爽汇编语言综合研究实验报告
9
王爽《汇编语言(第 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个CPU的寻址能力为8KB,那么它的地址总线的宽度为 13位。

(2)1KB的存储器有 1024 个存储单元,存储单元的编号从 0 到 1023 .(3)1KB的存储器可以存储 8192(2^13) 个bit, 1024个Byte.(4)1GB是 1073741824 (2^30)个Byte、1MB是 1048576(2^20)个Byte、1KB是 1024(2^10)个Byte。

(5)8080、8088、80296、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)在存储器中,数据和程序以二进制形式存放.解题过程:(1)1KB=1024B,8KB=1024B*8=2^N,N=13。

(2)存储器的容量是以字节为最小单位来计算的,1KB=1024B。

(3)8Bit=1Byte,1024Byte=1KB(1KB=1024B=1024B*8Bit).(4)1GB=1073741824B(即2^30)1MB=1048576B(即2^20)1KB=1024B(即2^10)。

(5)一个CPU有N根地址线,则可以说这个CPU的地址总线的宽度为N.这样的CPU最多可以寻找2的N次方个内存单元。

(一个内存单元=1Byte).(6)8根数据总线一次可以传送8位二进制数据(即一个字节)。

(7)8086的数据总线宽度为16根(即一次传送的数据为2B)1024B/2B=512,同理1024B/4B=256。

汇编语言 第二版 王爽 完整答案

汇编语言 第二版 王爽 完整答案

第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)查看内存中的内容。

汇编语言(王爽)_第二版_课后题全_答案8

汇编语言(王爽)_第二版_课后题全_答案8

-tAX=4E20 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 051614 ADD AX,1416-tAX=6236 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0106 NV UP EI PL NZ NA PE NC 0C1C:0106 BB0020 MOV BX,2000-tAX=6236 BX=2000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0109 NV UP EI PL NZ NA PE NC 0C1C:0109 01D8 ADD AX,BX-tAX=8236 BX=2000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=010B OV UP EI NG NZ NA PE NC 0C1C:010B 89C3 MOV BX,AX-tAX=8236 BX=8236 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=010D OV UP EI NG NZ NA PE NC 0C1C:010D 01D8 ADD AX,BX-tAX=046C BX=8236 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=010F OV UP EI PL NZ NA PE CY 0C1C:010F B81A00 MOV AX,001A-tAX=001A BX=8236 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0112 OV UP EI PL NZ NA PE CY 0C1C:0112 BB2600 MOV BX,0026-tAX=001A BX=0026 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0115 OV UP EI PL NZ NA PE CY 0C1C:0115 00D8 ADD AL,BL-tAX=0040 BX=0026 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0117 NV UP EI PL NZ AC PO NC。

汇编语言(王爽)_第二版_课后题全_答案5

汇编语言(王爽)_第二版_课后题全_答案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版)王爽著-课后实验报告详解

汇编语言(第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、进入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. 一般的产品软件系统,都可以在安装的时候设置搜索路径让系统在相关文件不在同一目录下,也可以找到相关文件。

王爽汇编语言综合研究实验报告

王爽汇编语言综合研究实验报告
11
王爽《汇编语言(第 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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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运行图如下:。

相关文档
最新文档