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

合集下载

汇编语言实验答案 (王爽)

汇编语言实验答案 (王爽)

汇编语言答案检测点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次方)检测点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个字节单元中)处。

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

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

AX=00E6 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=0001 ES=0DB4 SS=0DB4 CS=0DB4 IP=0124 NV UP EI PL NZ AC PE CY0DB4:0124 8A1E0C00 MOV BL,[000C] DS:000C=26-tAX=00E6 BX=0026 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=0001 ES=0DB4 SS=0DB4 CS=0DB4 IP=0128 NV UP EI PL NZ AC PE CY0DB4:0128 00D8 ADD AL,BL-tAX=000C BX=0026 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=0001 ES=0DB4 SS=0DB4 CS=0DB4 IP=012A NV UP EI PL NZ NA PE CY0DB4:012A C6061799FF MOV BYTE PTR [9917],FF DS:9917=9A-q检测点3.1(2)内存中的情况如图3.6所示各寄存器的初始值:cs=2000h,ip=0,ds=1000h,ax=0,bx=0;①写出CPU执行的指令序列(用汇编指令写出)。

②写出CPU执行每条指令后,CS、IP和相关寄存器的数值。

③再次体会:数据和程序有区别吗?如何确定内存中的信息哪些是数据,哪些是程序?图3.6内存情况示意检测点3.2(1)补全下面的程序,使其可以将10000H-1000FH中的8个字,逆序拷贝到20000H-2000FH 中。

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

汇编语言课后习题答案 王爽主编

汇编语言课后习题答案 王爽主编

补全编程,利用jcxz指令,实现在内存2000H段中查找第一个值为0的字节,找到后,将它的偏移地址存储在dx中。

assume cs:codecode segmentstart: mov ax,2000hmov ds,axmov bx,0s: mov ch,0mov 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,0inc 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入栈,最后转到标号处执行指令。

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

王爽汇编语言综合研究实验报告
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章基础知识检测点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。

汇编语言-王爽(第二版)-实验九-根据材料编程

汇编语言-王爽(第二版)-实验九-根据材料编程

实验九根据材料编程
【实验内容】
在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串‘welcome to masm!’
【实验过程】
;程序名:t9-12.asm
data segment
string db 'welcome to masm!'
len equ $-string
data ends
code segment
assume cs:code
start:
mov ah,0 ;设置显示方式
mov al,3 ;80*25彩色文本显示方式
int 10h
mov bp,seg string ;回送变量或标号的段地址
mov es,bp
mov bp,offset string
mov cx,len ;cx=串长度
mov dh,9
mov dl,30 ;dx=起始行列号
mov al,0 ;光标返回的起始位置 mov bl,02h
mov ah,13h ;显示字符串
int 10h
mov cx,len ;cx=串长度
mov dh,10
mov dl,30 ;dx=起始行列号
mov al,0 ;光标返回的起始位置 mov bl,24h
mov ah,13h ;显示字符串
int 10h
mov cx,len ;cx=串长度
mov dh,11
mov dl,30 ;dx=起始行列号
mov al,0 ;光标返回的起始位置 mov bl,71h
mov ah,13h ;显示字符串
int 10h
mov ah,4ch
int 21h
code ends
end start
【实验结果】。

汇编语言王爽课后答案

汇编语言王爽课后答案

汇编语言王爽课后答案【篇一:汇编语言课后习题答案王爽主编】一个值为 0 的字节,找到后,将它的偏移地址存储在assume cs:codecode segmentstart: mov ax,2000hmov ds,axmov bx,0s: mov ch,0 mov cl,[bx] jcxz ok;当cx=0 okinc bxjmp short sok: mov dx,bxmov ax ,4c00hint 21hcode endsend start dx 中。

时, cs:ip 指向检测点 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 cscs 入栈,再将偏移地址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(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。

(8)在存储器中指令和数据没有任何区别,都是⼆进制信息。

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

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

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

汇编语言(第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. 掌握计算机汇编语言的基本原理和理论知识。

2. 熟悉汇编语言的基本语法和命令。

3. 学会使用汇编语言编写简单的程序。

4. 掌握程序的调试和优化方法,提高程序的效率和性能。

二、实验内容1. 汇编语言的基本概念和原理2. 汇编语言的基本语法和命令3. 汇编语言的程序设计4. 程序的调试和优化方法三、实验过程1. 学生首先需要理解汇编语言的基本概念和原理,包括计算机的指令集和操作原理等。

老师可以通过讲解和示范来帮助学生理解这些概念。

2. 然后,学生需要学习汇编语言的基本语法和命令。

他们可以通过阅读教材和参考资料来学习这些知识,并通过实际操作来加深理解。

3. 接下来,学生将学习如何使用汇编语言来编写简单的程序。

他们可以从简单的加减乘除运算开始,逐渐扩展到更复杂的程序设计。

4. 最后,学生将学习如何调试和优化程序。

他们可以通过排查程序中的错误和优化算法来提高程序的效率和性能。

四、实验要求1. 学生需要认真学习汇编语言的相关知识,包括基本概念、语法和命令等。

2. 学生需要认真完成实验内容,并及时向老师汇报实验进展。

3. 学生需要认真总结实验经验,包括遇到的问题、解决的方法和收获的经验等。

通过王爽汇编实验,学生可以深入理解计算机汇编语言的原理和应用,掌握程序设计的基本技能,并提高程序的调试和优化能力。

这些知识和技能将对学生今后的学习和工作产生重要的影响。

因此,王爽汇编实验是一项非常重要的实验课程,值得学生认真对待。

汇编语言王爽第二版课后答案

汇编语言王爽第二版课后答案

s:
push [bx]
pop cs:[bx] 空
;此条指令为所填第三
add bx,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start
实验 5 编写、调试具有多个段的程序(第 123 页)
----------------------------------------
提示:此题可在 DEBUG 中利用 E 命令在本机上按照 题目中所给出的内存单元及其数据进行相应地修 改,然后再用 A 命令进行写入(题目中所给出的)相 应的汇编指令,最后再进行 T 命令进行逐步执行, 以查看相应结果。
1
汇编语言课后答案
(2) 1.指令序列如下: mov ax,6622h jmp 0ff0:0100 mov ax,2000h mov ds,ax mov ax,[0008] mov ax,[0002]
注意: 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
ax=5BEA ax=5CCA bx=30F0 bx=6029 sp=FE 220FE 5CCA sp=FC 220FC 6029 sp=FE 6029 sp=100H 5CCA sp=FE 220FE 30F0 sp=FC 220FC 2E39

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

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

综合研究一研究报告一、研究步骤如下: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,...),参数一传入了一个字符的数量, 参数二传入显示的颜色,参数三开始传入要显示的字符。函数通过参数一来控制显示字符的 循环次数,通过这种方式来接收多个参数。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(此文档为word格式,下载后您可任意编辑修改!) 实验一:用E命令将指令写入内存:用A命令将指令写入内存:实验1-2代码如下:用a命令在2000:0000处写如要写如的代码,然后用R命令来修改CS为2000,IP修改为0,然后用T命令执行,直到AX 中的值为10,因为是默认为十六进制,所以ax中的0010实际代表十进制的16。

如图:实验1-3:用D命令输入内存fff0h~fffffh,则可看到:生产日期为061509在地址为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 内容是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执行中断时会保留现场,即将标志寄存器,CS,IP等入栈,而实验中栈的地址正好是要查询的内存地址,所以即便未对内存单元进行写入命令,但里面的值会因为CPU要保留现场自动被改了实验3(1)代码:ASSUME CS:CODESCODES SEGMENTSTART: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代码如下:DATAS SEGMENTdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hDATAS ENDSSTACKS SEGMENTdw 0,0STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,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:STACKSDATAS SEGMENTdw 0123h,0456hDATAS 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:DATAS,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 ENDSDATAS SEGMENTdw 0123h,0456hDATAS 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 7,8a ENDSb SEGMENTdb 7,8b ENDSCC SEGMENTdb 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 ah,0bh,0ch,0dh,0eh,0fh,0ffha endsb SEGMENTdw 0,0b ENDSCODES SEGMENTASSUME CS:CODES START: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,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 albmov [bx+si],alinc siloop sadd bx,16pop cxloop s0MOV AH,4CHINT 21HCODES ENDSEND START实验6运行图如下:实验7代码如下:DATAS SEGMENTDb'1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985','1986','19 87','1988','1989','1990','1991','1992','1993','1994','1995'dd14dddw,8226dwDATAS 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代码如下:DATAS SEGMENTdb'welcome to masm!'DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART:MOV AX,DATASMOV DS,AXmov bx,0mov ax,0b800hmov es,axmov si,1980 ;将显示的区域定在屏幕中间mov cx,16s: mov al,[bx]mov es:[si],almov ahb ;将颜色定为绿色mov es:[si+1],ahadd si,2inc bxloop smov bx,0mov si,2140 ;下一行接着从来mov cx,16s1: mov al,[bx]mov es:[si],almov ahb ;颜色为绿底红色mov es:[si+1],ahadd si,2inc bxloop s1mov bx,0mov si,2300 ;同上mov cx,16s2: mov al,[bx]mov es:[si],almov ahbmov es:[si+1],ahadd si,2inc bxloop s2MOV AH,4CHINT 21HCODES ENDSEND START实验9运行图如下:实验10-1代码如下:DATa SEGMENTdb 'welcome to masm!',0DATA 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代码如下:DATa1 SEGMENTdw 8,3,38DATA1 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中数据为“3”,这里将其反置为“8”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运行图如下:。

相关文档
最新文档