汇编实验题.docx

上传人:b****6 文档编号:6006332 上传时间:2023-01-02 格式:DOCX 页数:19 大小:18.97KB
下载 相关 举报
汇编实验题.docx_第1页
第1页 / 共19页
汇编实验题.docx_第2页
第2页 / 共19页
汇编实验题.docx_第3页
第3页 / 共19页
汇编实验题.docx_第4页
第4页 / 共19页
汇编实验题.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

汇编实验题.docx

《汇编实验题.docx》由会员分享,可在线阅读,更多相关《汇编实验题.docx(19页珍藏版)》请在冰豆网上搜索。

汇编实验题.docx

汇编实验题

实验2用机器指令和汇编指令编程(第70页)

2.实验任务

(1)使用Debug,将下面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。

从第一空开始依次如下:

ax=5BEA

ax=5CCA

bx=30F0

bx=6029

sp=FE220FE5CCA

sp=FC220FC6029

sp=FE6029

sp=100H5CCA

sp=FE220FE30F0

sp=FC220FC2E39

实验4[BX]和loop的使用(第113页)

-------------------------------

(1)编程,向内存0:

200~0:

23F依次传送数据0~63(3FH)。

程序如下:

assumecs:

codesg

codesgsegment

movax,0020h

movds,ax

movbx,0

movdl,0

movcx,40h

s:

mov[bx],dl

incdl

incbx

loops

movax,4c00h

int21h

codesgends

end

(2)编程,向内存0:

200~0:

23F依次传送数据0~63(3FH),程序中只能使用9条指令,9条指令中包括“movax,4c00h”和“int21h”。

程序如下:

assumecs:

codesg

codesgsegment

movax,0020h

movds,ax

movbl,0

movcx,40h

s:

mov[bx],bl

incbl

loops

movax,4c00h

int21h

codesgends

end

(3)下面的程序的功能是将“movax,4c00h”之前的指令复制到内存0:

200处,补全程序。

上机调试,跟踪运行结果。

assumecs:

code

codesegment

movax,code;code为所填写的数据

movds,ax

movax,0020h

moves,ax

movbx,0

movcx,18h;18h为所填写的数据

s:

moval,[bx]

moves:

[bx],al

incbx

loops

movax,4c00h

int21h

codeends

end

assumecs:

codesg

codesgsegment

dw0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

start:

movax,0

movds,ax

movbx,0

movcx,8

s:

movax,[bx]

movcs:

[bx],ax;此条指令为所填指令

addbx,2

loops

movax,4c00h

int21h

codesgends

endstart

(2)

assumecs:

codesg

codesgsegment

dw0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

dw0,0,0,0,0

start:

movax,cs;cs为所填第一空

movss,ax

movsp,1ah;此条指令为所填第二空

movax,0

movds,ax

movbx,0

movcx,8

s:

push[bx]

popcs:

[bx];此条指令为所填第三空

addbx,2

loops

movax,4c00h

int21h

codesgends

endstart

实验5编写、调试具有多个段的程序(第123页)

1.保持不变

2.<考虑不同机子环境不同,答案无法统一>

3.X-2,X-1

(2)

1.保持不变

2.<考虑不同机子环境不同,答案无法统一>

3.X-2,X-1

4.(N/16+1)*16[说明:

N/16只取整数部分]

(3)

1.保持不变

2.<考虑不同机子环境不同,答案无法统一>

3.X+3,X+4

(5)完整程序如下:

assumecs:

code

asegment

db1,2,3,4,5,6,7,8

aends

bsegment

db1,2,3,4,5,6,7,8

bends

csegment

db0,0,0,0,0,0,0,0

cends

codesegment

start:

movax,a

moves,ax

movax,c

movds,ax

movbx,0

movcx,8

s1:

movax,es:

[bx]

add[bx],ax

addbx,2

loops1

movax,b

moves,ax

movds,ax

movbx,0

movcx,8

s2:

movax,es:

[bx]

add[bx],ax

addbx,2

loops2

movax,4c00h

int21h

codeends

endstart

(6)完整程序如下:

assumecs:

code

asegment

dw1,2,3,4,5,6,7,8

aends

bsegment

dw0,0,0,0,0,0,0,0

bends

codesegment

start:

movax,b

movss,ax

movsp,10h

movax,a

movds,ax

movbx,0

movcx,8

s:

push[bx]

addbx,2

loops

movax,4c00h

int21h

codeends

endstart

实验6实践课程中的程序(第147页)

(2)编程:

完成问题中的程序。

问题7.9完整程序如下:

assumecs:

codesg,ss:

stacksg,ds:

datasg

stacksgsegment

dw0,0,0,0,0,0,0,0

stacksgends

datasgsegment

db'1.display'

db'2.brows'

db'3.replace'

db'4.modify'

datasgends

codesgsegment

start:

movax,stacksg

movss,ax

movsp,16

movax,datasg

movds,ax

movbx,0

movcx,4

s:

;外循环

pushcx

movsi,3

movcx,4

s0:

;内循环

moval,[bx+si]

andal,11011111b

mov[bx+si],al

incsi

loops0

addbx,16

popcx

loops

movax,4c00h

int21h

codesgends

endstart

实验7寻址方式在结构化数据访问中的应用(第160页)

完整程序如下:

assumecs:

codesg,ds:

data,es:

table

datasegment

db'1975','1976','1977','1978','1979','1980','1981','1982','1983'

db'1984','1985','1986','1987','1988','1989','1990','1991','1992'

db'1993','1994','1995'

;以上是表示21年的21个字符串

dd16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514

dd345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000

;以上是表示21年公司总收的21个dword型数据

dw3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226

dw11542,14430,45257,17800

dataends

tablesegment

db21dup('yearsummne?

?

')

tableends

codesgsegment

start:

movax,data

movds,ax

movax,table

moves,ax

movbx,0

movsi,0

movdi,0

movcx,21

s:

;进入循环

moval,[bx]

moves:

[di],al

moval,[bx+1]

moves:

[di+1],al

moval,[bx+2]

moves:

[di+2],al

moval,[bx+3]

moves:

[di+3],al

;以上8句的作用是存放年份

movax,54h[bx];第一个'年收入'的段基址为54H

movdx,56h[bx]

moves:

5h[di],ax

moves:

7h[di],dx

;以上4句的作用是存放公司总收入

movax,0A8h[si];第一个'人数'的段基址为0A8H

moves:

0Ah[di],ax

;以上2句是存放公司的人数

movax,54h[bx]

divwordptrds:

0A8h[si]

moves:

0dh[di],ax

;以上3句是存放人均收入

addbx,4

addsi,2

adddi,16

;以上3句是为下一次循环时存放数据做准备

;3个寄存器递增的速度决定了所要存取的数据的位置的偏移地址

loops;跳到标号s处

movax,4c00h

int21h

codesgends

endstart

实验8分析一个奇怪的程序(第174页)分析下面的程序,在运行前思考:

这个程序可以正确返回吗?

运行后再思考:

为什么是这种结果?

通过这个程序加深对相关内容的理解。

assumecs:

codesg

codesgsegment

movax,4c00h

int21h

start:

movax,0

s:

nop

nop

movdi,offsets

movsi,offsets2

movax,cs:

[si]

movcs:

[di],ax

s0:

jmpshorts

s1:

movax,0

int21h

movax,0

s2:

jmpshorts1

nop

codesgends

endstart

程序可以正常返回。

详细分析:

在此题中较为深入地考察了‘段内直接短转移’[形如:

jmpshort标号]的概念。

我们知道程序中:

movdi,offsets

movsi,offsets2

movax,cs:

[si]

movcs:

[di],ax

实验9根据材料编程(第175页)

assumecs:

code,ds:

data,ss:

stack

datasegment

db'welcometomasm!

';定义要显示的字符串(共16字节)

db02h,24h,71h;定义三种颜色属性

dataends

stacksegment

dw8dup(0)

stackends

codesegment

start:

movax,data

movds,ax

movax,stack

movss,ax

movsp,10h

movbx,0

movdi,0

movax,0b872h;算出屏幕第12行中间的显存的段起始位置放入ax中

movcx,3;外循环为3次,因为要显示三个字符串

s3:

pushcx;三个进栈操作为外循环s3保存相关寄存器的值

pushax;以防止它们的值在内循环中被破坏

pushdi

moves,ax;此时es为屏幕第12行中间的显存的段起始位置

movsi,0

movdi,0

movcx,10h;内循环为10h次,因为一个字符串中含10h个字节

s1:

moval,ds:

[bx+si]

moves:

[bx+di],al

incsi

adddi,2

loops1;此循环实现偶地址中存放字符

movsi,1;si的值设为1,从而为在显存奇地址中存放字符的颜色属性做准备

popdi;将di的值恢复成进入内循环之前的时候的值

moval,ds:

10h[bx+di];取颜色属性[源OP寻址方式:

相对基址变址]

movcx,10h;第二个内循环也为10h次

s2:

moves:

[bx+si],al

addsi,2

loops2;此循环实现奇地址中存放字符的颜色属性

;以下4句为下一趟外循环做准备

incdi

popax

addax,0ah;将显存的段起始地址设为当前行的下一行

;[在段地址中加0ah,相当于在偏移地址中加了0a0h(=160d)]

popcx

loops3

movax,4c00h

int21h

codeends

endstart

实验10编写子程序(第194页)

1.显示子程序

完整程序如下:

datasegment

db'Welcometomasm!

',0

dataends

codesegment

assumecs:

code,ds:

data

start:

movdh,1;dh装行号(范围:

1--25)

movdl,1;dl装列号(范围:

1--80)[注:

每超过80等于行号自动加1]

movcl,0cah;cl中存放颜色属性(0cah为红底高亮闪烁绿色属性)

movax,data

movds,ax

movsi,0

callshow_str

movax,4c00h

int21h

show_str:

;显示字符串的子程序[定义开始]

pushcx

pushsi

moval,0A0h

decdh;行号在显存中下标从0开始,所以减1

muldh

movbx,ax

moval,2

muldl

subax,2;列号在显存中下标从0开始,又因为偶字节存放字符,所以减2

addbx,ax;此时bx中存放的是行与列号的偏移地址

movax,0B800h

moves,ax;es中存放的是显存的第0页(共0--7页)的起始的段地址

movdi,0

moval,cl

movch,0

s:

movcl,ds:

[si]

jcxzok

moves:

[bx+di],cl;偶地址存放字符

moves:

[bx+di+1],al;奇地址存放字符的颜色属性

incsi

adddi,2

jmpshorts

ok:

popsi

popcx

ret;显示字符串的子程序[定义结束]

codeends

endstart

2.解决除法溢出的问题(第197页)

完整程序如下:

assumecs:

code,ss:

stack

stacksegment

dw8dup(0)

stackends

codesegment

start:

movax,stack

movss,ax

movsp,10h

movax,4240h

movdx,0fh

movcx,0ah

calldivdw

movax,4c00h

int21h

divdw:

;子程序定义开始

pushax

movax,dx

movdx,0

divcx

movbx,ax

popax

divcx

movcx,dx

movdx,bx

ret;子程序定义结束

codeends

endstart

3.数值显示(第198页)

完整程序如下:

assumecs:

code,ds:

data

datasegment

db10dup(0)

dataends

codesegment

start:

movax,12666

movbx,data

movds,bx

movsi,0

calldtoc

movdh,8

movdl,3

movcl,0cah

callshow_str

movax,4c00h

int21h

dtoc:

;数值显示的子程序定义

pushdx

pushcx

pushax

pushsi

pushbx

movbx,0

s1:

movcx,10d

movdx,0

divcx

movcx,ax

jcxzs2

adddx,30h

pushdx

incbx

jmpshorts1

s2:

adddx,30h

pushdx

incbx;再进行一次栈操作(补充当"商为零而余数不为零"时的情况)

movcx,bx

movsi,0

s3:

popax

mov[si],al

incsi

loops3

okay:

popbx

popsi

popax

popcx

popdx

ret;数值显示的子程序定义结束

show_str:

;显示字符串的子程序已经在第一题中说明,在此不再赘述。

pushbx

pushcx

pushsi

moval,0A0h

decdh

muldh

movbx,ax

moval,2

muldl

subax,2

addbx,ax

movax,0B800h

moves,ax

movdi,0

moval,cl

movch,0

s:

movcl,ds:

[si]

jcxzok

moves:

[bx+di],cl

moves:

[bx+di+1],al

incsi

adddi,2

jmpshorts

ok:

popsi

popcx

popbx

ret

codeends

endstart

实验11编写子程序(第224页)

完整程序如下:

assumecs:

codesg

datasgsegment

db"Beginner'sAll-purposeSymbolicInstructionCode.",0

datasgends

codesgsegment

begin:

movax,datasg

movds,ax

movsi,0

callletterc

movax,4c00h

int21h

letterc:

;子程序部分[开始]

pushsi

s0:

moval,[si]

cmpal,0

jeexitsub

cmpal,61h;61h为'a'的ASCII码

jbnext

cmpal,7ah;7ah为'z'的ASCII码

janext

andal,11011111B;或使用subal,20h

mov[si],al

next:

incsi

jmpshorts0

exitsub:

popsi

ret;子程序部分[结束]

codesgends

endbegin

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 理学

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

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