汇编实验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验6 实践课程中的程序(1)

(2)编程,完成问题7.9中的程序

解:

assume cs:codesg,ss:stacksg,ds:datasg stacksg segment

dw 0,0,0,0,0,0,0,0

stacksg ends

datasg segment

db '1. display '

db '2. brows '

db '3. replace '

db '4. modify '

datasg ends

codesg segment

start: mov ax,datasg

mov ds,ax

mov bx,0

mov ax,stacksg

mov ss,ax

mov sp,16

mov si,3

mov cx,4

s0: push cx

push si

mov cx,4

s: mov al,[bx+si]

add al,11011111b

mov [bx+si],al

inc si

loop s

add bx,16

pop si

pop cx

loop s0

mov ax,4c00h

int 21h

codesg ends

end start

实验七寻址方式在结构化数据访问中的应用

将data段中的数据按如下格式写入到table段中,并计算21年中的人均收入(取整),结果也按照如下格式保存在table表中。

data段的数据格式

data段中的数据如下:

assume cs:codesg

data segment

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

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

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

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

dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000

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

dw 11542,14430,15527,17800

data ends

table segment

db 21 dup ('year summ ne ?? ')

table ends

codesg segment

start: ?(???)

codesg ends

end

实验八分析一个奇怪的程序

分析下面的程序,在运行前思考:这个程序可以正确返回吗?运行后思考:为什么是这种结果?

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

assume cs:codesg

codesg segment

mov ax,4c00h

int 21h start: mov ax,0

s: nop

nop

mov di,offset s

mov si,offset s2

mov ax,cs:[si]

mov cs:[di],ax s0: jmp short s

s1: mov ax,0

int 21h

mov ax,0

s2: jmp short s1

nop

解:

实验九根据材料编程

实验十编写子程序

1. 显示字符串

问题

显示字符串是现实工作中经常要用到的功能,应该编写一个通用的子程序来实现这个功能。我们应该提供灵活的调用接口,使调用者可以决定显示的位置(行、列)、内容和颜色。

子程序描述

名称:show_str

功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79), (cl)=颜色,ds:si指向字符串的首地址

返回:无

就用举例:在屏幕的8行3列,用绿色显示data段中的字符串。

测试结果:

指定位置以指定颜色显示字符串

闪烁后

2.解决除法溢出的问题

问题

前面讲过,div指令可以做除法。当进行8位除法的时候,用al存储结果的商,ah存储结果的余数:进行16位除法的时候,用ax存储结果的商,dx存储结果的余数。可是,现在有一个问题,如果结果的商大于ah或ax所能存储的最大值,那么将如何?

比如,下面的程序段:

mov bh,1

mov ax,1000

div bh

进行的是8位除法,结果的商为1000,而1000在ah中放不下,

又比如,下面的程序段:

mov ax,1000h

mov dx,1

mov bx,1

div bx

进行的是16位除法,结果的商为11000H,而11000H在ax中存放不下。

我们在用div指令做除法的时候,很可能发生上面的情况:结果的商过大,超出了寄存器所能存储的范围。当CPU执行div等除法指令的时候。如果发生这样的情况,将引发CPU的一个内部错误。这个错误被称为:除法溢出。我们可以通过特殊的程序来处理这个错误。

好了,我们已经清楚了问题的所在:用div指令做除法的时候可能产生除法溢出。由于有这样的问题,在进行除法运算的时候要注意除数和被除数的值,比如1000000/10就不能用div 指令来计算。那么怎么办呢?我们用下面的子程序divdw解决。

子程序描述

名称:divdw

功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。参数:(ax)=dword型数据的低16位

(dx)=dword型数据的高16位

(cx)=除数

返回:(dx)=结果的高16位,(ax)=结果的低16位

(cx)=余数

应用举例:计算1000000/10(F4240H/0AH)

相关文档
最新文档