汇编语言实验报告
更新时间:2024-02-01 13:03:01 阅读量: 教育文库 文档下载
实验1 查看CPU和内存,用机器指令和汇编指令编程
1.预备知识:Debug的使用
2.实验任务(第45页) (1)已跟踪执行 (2)
(3)通过DEBUG中的D命令查看到主板的生产日期[以月、日、年,分隔符为'/'的格式]存储在内存ffff:0005~ffff:000C(共8个字节单元中)处。此生产日期不能被改变,因为其具有‘只读’属性。
(4)通过向内存中的显存写入数据,使计算机根据写入的数据进行ASCII转换,并将转换后且可打印的字符输出到屏幕上。
(5)
实验2 用机器指令和汇编指令编程
1.预备知识:Debug的使用
2.实验任务(第71页)
(1)使用Debug,将下面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。
从第一空开始依次如下: ax=5BEA ax=5CCA bx=30F0 bx=6022
sp=FE 220FE 5CCA sp=FC 220FC 6022 sp=FE 6022 sp=100H 5CCA sp=FE 220FE 30F0 sp=FC 220FC 2F32
说明:此题可能因机子软、硬件环境不同而导致答案不一致!
(2)仔细观察图3.19的实验过程,然后分析:为什么2000:0~2000:f中的内容会发生改变?
答:因为用T指令进行调试时,会产生中断。而为了保护现场,CPU则先将标志寄存器进栈、再把当前CS的值进栈,最后将IP的值进栈。
实验三 汇编语言程序的调试与运行
1. 将下面的程序保存为t1.asm文件,生成可执行文件t1.exe; assume cs:codesg
codesg segment
mov ax,2000h mov ss,ax mov sp,0 add sp,4 pop ax pop bx push ax push bx pop ax pop bx
mov ax,4c00h int 21h
codesg ends end
3. 下面程序的功能是将“mov ax,4c00h”之前的指令复制到内存0:200处,补全程序。上
机调试,跟踪运行结果。 assume cs:code
code segment
mov ax,code //或者是cs mov ds,ax mov ax,0020h mov es,ax
mov bx,0 mov cx,18h s: mov al,[bx] mov es:[bx],al inc bx loop s
mov ax,4c00h int 21h
code ends end
注意事项:
1.因为要复制的数据是代码段的一部分指令,那么要复制的数据的段地址就和代码段的段地址相同。
2. 因为要复制的数据是代码段的一部分指令,所以要复制的数据的长度,就是要复制的指令的长度,可以先假设要复制8位[1h~0ffh]数据的字节数(如:10h),把程序补全,以便通过编译。将程序补充完整并将其编译、连接、运行,接着进行DEBUG,在DEBUG时我们可以算出该程序的长度。然后得到正确的值后重新将程序补充完整。
(1) 复制的是什么?从哪里到哪里?
答:复制的是代码的二进制数据,从CS:0到ES:0。
(2) 复制的是什么?有多少个字节?你如何知道要复制的字节的数量?
答:复制的是代码的二进制数据,有CX个字节,因为CX存放的是程序的长度。
实验五 编写、调试具有多个段的程序
1. 将下面的程序编译链接,用Debug加载、跟踪,然后回答问题:
assume cs:code,ds:data,ss:stack data segment
dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H data ends stack segment
dw 0,0,0,0,0,0,0,0 stack ends code segment
start: mov ax,stack mov ss,ax mov sp,16 mov ax,data mov ds,ax push ds:[0]
push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends end start
① CPU执行程序,程序返回前,data段中的数据均不变.
② CPU执行程序,程序返回前,cs=__2933___、ss=_2931___、ds=__2921___.
③ 该程序加载后,code段的段地址为X,则data段的段地址为___X-2_____,stack段的
段地址为__X-1___。
2.将下面的程序编译连接,用Debug加载、跟踪,然后回答问题:
assume cs:code,ds:data,ss:stack data segment dw 0123H,0456H data ends stack segment dw 0,0 stack ends code segment
start: mov ax,stack mov ss,ax mov sp,16 mov ax,data mov ds,ax push ds:[0]
push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends end start
① CPU执行程序,程序返回前,data段中的数据均不变.
② CPU执行程序,程序返回前,cs=__2933__、ss=___2931__、ds=__2921___.
③ 该程序加载后,code段的段地址为X,则data段的段地址为__X-2___,stack段的段
地址为___X-1_____。
④ 对于如下定义的段:
name segment ??? name ends
如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为((N+15)/16)*16_。
④解析:
N分为被16整除和不被16整除。
当N被16整除时: 占有的空间为(N/16)*16
当N不被16整除时: 占有的空间为(N/16+1)*16,N/16得出的是可以整除的部分,还有一个余数,余数肯定小于16,加上一个16。
程序加载后分配空间是以16个字节为单位的,也就是说如果不足16个字节的也分配16个字节。
两种情况总结成一个通用的公式:((N+15)/16)*16
3. 将下面的程序编译连接,用Debug加载、跟踪,然后回答问题:
assume cs:code,ds:data,ss:stack code segment
start: mov ax,stack mov ss,ax mov sp,16 mov ax,data mov ds,ax push ds:[0]
push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends data segment dw 0123H,0456H data ends stack segment dw 0,0 stack ends end start
① CPU执行程序,程序返回前,data段中的数据均不变.
② CPU执行程序,程序返回前,cs=__2931___、ss=__2934___、ds=__2935____.
③ 设程序加载后,code段的段地址为X,则data段的段地址为___X+3_____,stack段的
段地址为___X+4____。
4.若将1,2,3题中的最后一条伪指令“end start“改为“end”,则那个程序仍然可以正确执行?请说明原因。
答:这三条程序仍然可以正确执行,只是不知道入口位置.如果不指明入口位置,则程序从所分配的空间开始执行,前2个是数据段,只有从第3条开始是指令代码。
5.程序如下,编写code段中的代码,将a段和b段中的数据依次相加,将结果存到c段中。
assume cs:code a segment
db 1,2,3,4,5,6,7,8 a ends b segment
db 1,2,3,4,5,6,7,8 b ends c segment
db 0,0,0,0,0,0,0,0 c ends
code segment start:
mov ax,a mov ds,ax mov ax,b mov es,b mov bx,0 mov cx,8 s: mov al, [bx] add es:[bx],al inc bx loop s
mov ax,c mov ds,ax mov bx,0 mov cx,8
s0: mov al,es:[bx] mov [bx],al inc bx loop s0
mov ax,4c00h int 21h code ends end start
一次循环版:
mov ax,a
mov ds,ax ;ds指向a段地址 mov ax,b
mov es,ax ;es指向b段地址
mov bx,0 mov cx,8
s: mov al,[bx] add al,es:[bx] mov dx,c
mov ds,dx ;ds指向c段地址 mov [bx],al mov ax,a
mov ds,ax ;重新将ds指向a段 inc bx loop s
一次循环版(改进版): ;利用堆栈
mov ax,a mov ds,ax mov ax,b mov es,ax mov ax,c mov ss,ax
mov bx,0 mov cx,8
s: mov ax,[bx] mov ss:[bx],ax mov ax,es:[bx] add ss:[bx],ax inc bx loop s
6.程序如下,编写code段中的代码,用push指令将a段中的word数据,逆序存储到b段中。
assume cs:code a segment
dw 1,2,3,4,5,6,7,8 a ends b segment
dw 0,0,0,0,0,0,0,0 b ends
code segment start:
mov ax,a mov ds,ax mov bx,b mov ss,bx mov sp,16
mov bx,0 mov cx,8 s: push [bx] add bx,2 loop s
mov ax,4c00h int 21h code ends end start
实验六 不同寻址方式的灵活应用
1.将课程上所有讲解过的程序上机调试,用debug跟踪其执行过程,并在过程中进一步理解所讲内容.
程序7.1
assume cs:code,ds:data
data segment db 'unIX'
db 'foRK' ;共定义8个字节,但程序的运行位置仍在16字节之后 data ends
code segment
start: mov al,'a' mov bl,'b' mov ax,4c00h int 21h code ends end start
程序7.1.1
将第一个字符串转换为大写,将第二个字符串转换为小写
assume cs:codesg,ds:datasg
datasg segment db 'BaSiC'
db 'iNfOrMaTiOn' datasg ends
codesg segment
start: mov ax,datasg
mov ds,ax
mov bx,0
mov cx,5 s: mov al,[bx] and al,11011111B mov [bx],al inc bx loop s
mov bx,5
mov cx,11 s0: mov al,[bx]
or al,00100000B mov [bx],al inc bx loop s0
mov ax,4c00h int 21h
codesg ends end start
;设置ds指向datasg段 ;设置bx = 0,ds:bx指向'BaSiC'的第一个字母 ;设置循环次数为5,因为'BaSiC'有5个字母 ; 将ASCII码从ds:bx所指向的单元中取出 ;将al中ASCII码的第五位置0,变为大写字母 ;将转变后的ASCII码写回原单元 ;bx 加1,ds:bx指向下一个字母 ;设置bx = 5,ds:bx指向'iNfOrMaTiOn' 的第一个字母;设置循环次数11,因为'iNfOrMaTiOn'有11个字母 ;将al中的ASCII码的第五位置为1,变为小写字母
问题7.6
编程,将 datasg 段中的每个单词的头一个字母改为大写字母
assume cs:codesg,ds:datasg
datasg segment
db '1. file ' db '2. edit ' db '3. search ' db '4. view ' db '5. options ' db '6. help ' datasg ends
codesg segment
start: mov ax,datasg mov ds,ax
mov bx,0
mov cx,6 s: mov al,[bx+3] and al,11011111B mov [bx+3],al add bx,16 loop s
mov ax,4c00h int 21h
codesg ends end start
问题7.8
编程,将 datasg 段中的每个单词改为大写字母
申请内存空间:
assume cs:codesg,ds:datasg
datasg segment
db 'ibm ' db 'dec ' db 'dos ' db 'vax '
dw 0 ;定义一个字,用来暂存cx datasg ends
codesg segment
start: mov ax,datasg mov ds,ax
mov bx,0
mov cx,4
s0: mov ds:[40H],cx ;将外层循环的cx值保存在datasg:40H单元中 mov si,0 mov cx,3
s: mov al,[bx+si] and al,11011111B mov [bx+si],al inc si loop s
add bx,16
mov cx,ds:[40H] loop s0
mov ax,4c00h int 21h
codesg ends end start
利用堆栈:
assume cs:codesg,ds:datasg,ss:stacksg
datasg segment
db 'ibm ' db 'dec ' db 'dos ' db 'vax ' datasg ends
stacksg segment
dw 0,0,0,0,0,0,0,0 ;定义一个段,用来做栈段,容量为16个字节 codesg segment start: mov ss,ax mov sp,16 mov ax,datasg mov ds,ax
mov bx,0
mov cx,4
s0: push cx ;将外层循环的cx值压栈 mov si,0
mov cx,3 ;cx设置为内层循环的次数
s: mov al,[bx+si] and al,11011111B mov [bx+si],al inc si loop s
add bx,16
pop cx ;从栈顶弹出原cx的值,恢复cx
loop s0 ;外层循环的loop指令将cx中的计数值减去1
mov ax,4c00h int 21h
codesg ends end start
2.编程,完成问题7.9中的程序
(编程,将datasg段中每个单词的前4个字母改为大写字母。)
assume cs:codesg,ds:datasg,ss:stacksg
datasg segment
db '1. display ' db '2. brows ' db '3. replace ' db '4. modify ' datasg ends
stacksg segment
dw 0,0,0,0,0,0,0,0 stacksg ends
codesg segment
start: mov ax,datasg mov ds,ax mov bx,0
mov ax,stacksg mov ss,ax mov sp,16
mov cx,4 s0: push cx mov si,3 mov cx,4
s: mov al,[bx+si] and al,11011111b mov [bx+si],al inc si loop s
add bx,16 pop cx loop s0
mov ax,4c00h int 21h codesg ends end start
实验七 寻址方式在结构化数据访问中的应用
实验内容
下面的程序中已经定义好了这些数据: assume cs:codesg
data segment
db ‘1975’,’1976’,’1977’,’1978’,’1980’,’1980’,’1981’,’1982’,’1983’ db ‘1984’,’1985’,’1986’,’1987’,’1988’,’1989’,’1990’,’1991’,’1992’ db ‘1993’,’1994’,’1995’
;以上是表示21年的21个字符串
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000 ;以上是表示21年公司总收入的21个dword型数据
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226 dw 11542,14430,15257,17800
;以上是表示21年公司雇员人数的21个word型数据。 data ends
table segment
db 21 dup(‘year summ ne ?? ’) table ends
codesg segment start: codesg ends end start
编程:将data段中的数据按如下格式写入到table段中,并计算21年中的人均收入(取整),结果也按照下表所示的格式保存在table段中。
程序一:四个循环
assume cs:codesg,ds:data,es:table
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' ;84个字节
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 11452,14430,15257,17800 data ends
table segment
db 21 dup ('year summ ne ?? ') table ends
codesg segment
start: mov ax,data mov ds,ax mov ax,table mov ss,ax mov bx,0 mov si,0
mov bp,0 ;[bp]段地址默认在ss中 mov cx,21
s0:mov ax,[bx+si] ;切记,并不存在\段寄存器,段寄存器\这样的指令形式,故此处读 mov [bp+0],ax ;入数据时,必须执行先将数据存放到寄存器ax中,然后再放到制定寄
add si,2 ;存器,并且add si,2两次.依次类推按照不同偏移地址写入数据 mov ax,[bx+si] mov [bp+2],ax add si,2 add bp,10h loop s0
mov cx,21 mov bp,0 mov si,0
s1:mov ax,[bx+si+84] mov [bp+5],ax add si,2
mov ax,[bx+si+84] mov [bp+7],ax add si,2 add bp,10h loop s1
mov cx,21 mov bp,0 mov si,0
s2:mov ax,[bx+si+168] mov [bp+10],ax add si,2 add bp,10h loop s2
mov cx,21 mov bp,0
s3:mov ax,[bp+5] mov dx,[bp+7]
div word ptr [bp+10]
mov [bp+13],ax ;把寄存器ax中所得的商存放在table指定位置 add bp,10h loop s3
mov ax,4c00h int 21h
codesg ends end start
程序二:一个循环
assume cs:code,ds:data,es:table
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 11452,14430,15257,17800 data ends
table segment
db 21 dup ('year summ ne ?? ') table ends
code segment
start: mov ax,data mov ds,ax mov ax,table mov es,ax mov bx,0 mov si,0 mov di,0 mov cx,21 s: mov ax,[bx] mov es:[si],ax mov ax,[bx].2
mov es:[si].2,ax ;把db的数据写入指定位置
mov ax,[bx].84 mov es:[si].5,ax mov dx,[bx].86
mov es:[si].7,dx ;把dd的数据写入指定位置
div word ptr ds:[di].168
mov es:[si].13,ax ;把dw的数据作为除数,直接运算,并将寄存器ax的值送 mov ax,[di].168 ;入指定位置
mov es:[si].10,ax ;把dw的数据写入指定位置
add di,2 ;每回合改变的偏移地址 add bx,4
add si,16 loop s
mov ax,4c00h int 21h code ends end start
实验八 转移指令的原理
1. 分析下面的程序,在运行前思考:这个程序可以正确返回吗? 运行后再思考:为什么是这种结果?
assume cs:codesg
codesg segment
mov ax,4c00h int 21h
start: mov ax,0 ;将ax置0
s: nop ;占一字节,机器码90
nop ;占一字节,机器码90 mov di,offset s ;(di) = s的偏移地址 mov si,offset s2 ;(si) = s2偏移地址
mov ax,cs:[si] ;(ax) = jmp short s1指令对应的机器码EBF6 mov cs:[di],ax ;jmp short s1 覆盖s处两条nop指令
s0: jmp short s ;转移到已经被修改过的s处,执行jmp short s1,由此可 s1: mov ax,0 ;分析得已经返回至mov ax,4c00h处 int 21h mov ax,0 s2: jmp short s1 nop
codesg ends end start
当指令执行到s0:jmp short s时,该指令得到执行,编译器算出的ip位移量为-16(补码F0),(ip)=(ip)+位移量=18H+(-16)=8,cs:8指向s;
当指令执行到s标段jmp命令时,第1个字节中的机器码为EBF6,编译器算出的ip位移量为-10(补码F6),(ip)=(ip)+位移量=AH+(-10)=0,cs:0指向第一条指令。
实验9 根据材料编程
根据相关材料编程:材料详见书上188页
编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串 ’welcome to masm!’
assume cs:code,ds:data
data segment
db 'welcome to masm!'
data ends
code segment
start:mov ax,data mov ds,ax mov ax,0b800h mov es,ax mov bx,0 mov si,0 mov cx,16
s0: mov ax,[bx]
mov es:[bx+si+720h],ax mov es:[bx+si+721h],02h inc bx inc si loop s0
mov bx,0 mov cx,16 mov si,160 s1: mov ax,[bx]
mov es:[bx+si+720h],ax mov es:[bx+si+721h],24h inc bx inc si loop s1
mov bx,0 mov cx,16 mov si,320
s2: mov ax,[bx]
mov es:[bx+si+720h],ax mov es:[bx+si+721h],71h inc bx inc si loop s2
mov ax,4c00h int 21h
code ends end start
实验10 编写子程序
1. 显示字符串:编写一个通用的子程序来实现显示字符串的功能。
子程序描述: 名称:show_str
功能:在指定的位置用指定的颜色,显示一个用0结束的字符串。 参数:(dh)=行号(取值范围0-24), (dl)=列号(取值范围0-79) (cl)=颜色,ds:si指向字符串的首地址 返回:无
如:在屏幕的8行3列,用绿色显示data段中的字符串
assume cs:code data segment
db 'Welcome to masm!',0 data ends
code segment
start:mov dh,8 mov dl,3 mov cl,2 mov ax,data mov ds,ax mov si,0
call show_str
mov ax,4c00h int 21h
show_str: mov ax,160 mul dh mov bx,ax mov ax,2 mul dl add bx,ax mov ax,0B800H mov es,ax mov dl,cl mov cl,0
show0: mov ch,ds:[si] jcxz ok
mov byte ptr es:[bx],ch mov byte ptr es:[bx+1],dl add bx,2 inc si jmp show0 ok: ret code ends end start
2. 解决除法溢出问题:编写子程序避免除法溢出问题
子程序描述: 名称:divdw 功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。
参数:(ax)=dword型数据的低16位,(dx)= dword型数据的高16位,(cx)=除数 返回:(dx)= 结果的高16位,(ax)=结果的低16位, (cx)=余数
应用举例:计算1000000/10(F4240H/0AH),结果:(dx)=0001H,(ax)=86A0H,(cx)=0
assume cs:code code segment
start: mov ax,4240h mov dx,000fh mov cx,0ah call divdw
mov ax,4c00h
int 21h
;名称:divdw
;功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。
;参数:(ax)=dword型数据的低16位;(dx)=dword型数据的高16位;(cx)=除数。 ;返回:(dx)=结果的高16位;(ax)=结果的低16位;(cx)=余数。
divdw:
push si push bx push ax mov ax,dx mov dx,0
div cx ;被除数的高位/cx,高位在ax,余数在dx mov si,ax pop ax
div cx ;(被除数高位的商+低位)/cx,高位在ax,余数在dx mov cx,dx ;余数入cx mov dx,si ;高位的商入dx
pop bx pop si ret
code ends end start
公式x/n=int(h/n)*65536+[rem(h/n)*65536+l]/n解析: 把一个会溢出的除法 变成几个除法来做!
如果高位除法有商,那么商就是结果的高位值,如果会有余数,那么余数自然不能丢弃,余数就作为低位除法的dx(也就是高位的被除数,因为他是从高位除法中余下的)
做低位除法的时候,就拿余下的dx+低位数的ax除以除数,会得到 一个低位的商 和 余数 高位的商+低位数的商+余数 就是结果
关键点:不能按照那个公式进行运算,应该在充分理解的基础上写出算法
3. 数值显示:将二进制数据用十进制显示到屏幕 子程序描述: 名称:dtoc
功能:将word型数据转变为表示十进制的字符串,字符串以0结尾。 参数:(ax)=word型数据
ds:si指向字符串的首地址 返回:无
应用举例:编程将数据12666以十进制的形式在屏幕的8行3列,用绿色显示出来。
assume cs:code data segment
db 10 dup (0) data ends
code segment start:
mov ax,12666 ;把被除数看作是32位 mov bx,data mov ds,bx mov si,0 call dtoc
mov dh,8 mov dl,3 mov cl,2
call show_str
mov ax,4c00h int 21h
dtoc:mov bx,10 ;设置除数为10
mov dx,0 ;设置被除数的高位为0
mov cx,ax ;将除法运算后的商存入cx,jcxz跳转据此实现 div bx jcxz dtoc1
inc di ;记录字符个数 add dx,30h ;将余数转化为字符
push dx ;将dx入栈,保证输出的结果是正确的
jmp dtoc
dtoc1:mov cx,di ;将字符数目存入cx,依次决定写入的循环次数
dtoc2:pop dx ;将dx出栈,最先出栈的是最后存入的字符 mov ds:[si],dx;将dx写入数据区域 inc si ;指向下一个单元
loop dtoc2
mov [si],0 ;设置字符串的结尾符0 ret
show_str: mov ax,160 mul dh mov bx,ax mov ax,2 mul dl add bx,ax mov ax,0B800H mov es,ax mov dl,cl mov cl,0 mov si,0 show0:
mov ch,ds:[si] jcxz end1
mov byte ptr es:[bx],ch mov byte ptr es:[bx+1],dl add bx,2 inc si jmp show0 end1: ret
code ends end start
实验11 编写子程序
编写一个子程序,将包含任意字符,以0结尾的字符串中的小写字母转换成大写字母。 子程序描述如下: 名称:letterc
功能:将以以0结尾的字符串中的小写字母转换成大写字母 参数:ds:si指向字符串首地址
assume cs:codesg
datasg segment
db \
datasg ends
codesg segment
begin:mov ax,datasg mov ds,ax mov si,0 call letterc
mov ax,4c00h int 21h
letterc:mov ch,0 ;将寄存器cx的高位置为0 mov cl,ds:[si] ;将ds段中的字符存入cl cmp cl,97 jb s0
cmp cl,122
ja s0 ;判断读入的字符的ASCII码是否在97-122之间,如果是即为 and cl,11011111b ;小写字母
mov ds:[si],cl ;将二进制位的第五位置为0,使得小写字母变大写字母 s0: inc si ;将si自增,指向下一个字符
jcxz end1 ;通过判断读入的字符是否为0,来确定是否结束循环 jmp letterc end1: ret
codesg ends end begin
实验12 编写、应用中断例程
编写0号中断的处理程序,使得在除法溢出发生时,在屏幕中间显示字符串”divide error!”。然后返回到DOS. assume cs:code
code segment start:mov ax,cs mov ds,ax
mov si,offset do0 ;设置ds:si指向源地址 mov ax,0
mov es,ax ;使用中断向量表中不使用的内存单元 mov di,200h ;设置es:di指向目的地址 mov cx,offset do0end-offset do0 ;设置cx为传输长度 cld ;设置传输方向为正
rep movsb ;此处的指令类似于mov es:[di],word ptr ds:[si] ; loop s (事实上并不存在这种指令)
mov ax,0 mov es,ax
mov word ptr es:[0*4],200h
mov word ptr es:[0*4+2],0 ;设置中断向量表(除法溢出为0号中断)
mov ax,1000h mov bl,1
div bl ;此处为实验除法溢出的代码
mov ax,4c00h int 21h
do0: jmp short do0start ;指令占两个字节,故字符串的偏移地址为202h db \
do0start: mov ax,cs mov ds,ax
mov si,202h ;设置ds:si指向字符串
mov ax,0b800h mov es,ax
mov di,12*160+36*2 ;设置es:di指向显存空间的中间位置
mov cx,13 ;设置cx为字符长度
s: mov al,[si] mov es:[di],al inc si add di,2 loop s
mov ax,4c00h int 21h
do0end:nop code ends end start
正在阅读:
汇编语言实验报告02-01
应用地球化学期末复习选择题11-12
Superconductivity and Chiral Symmetry Breaking with Fermion Clusters06-05
《别有动机》剧情介绍 影评及看点介绍04-08
2012年“金钥匙”科技竞赛(初三学生CESL活动)决赛试题 有答案04-11
HP ProLiant 服务器进入BIOS 及RBSU的按键总结12-03
探究性学习在思想政治课教学中的运用12-18
流水行船问题及答案06-29
信息化建设与信息安全 在线考核答案12-25
老师求职信范文精选推荐05-17
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 汇编语言
- 实验
- 报告
- 基础会计必考大题
- 初中数学常见解题模型及套路(所有二级定理:解题必备的自有定理、课外定理)
- 4 药品拆零管理制度-药店新版GSP认证
- 砷化镓项目可行性研究报告
- 污水处理厂监理大纲
- 全国2008年10月建筑经济与企业管理试题及答案
- 物业招标文件
- 超越梦想,点燃希望 初中作文
- 群文阅读指导课 三年级《灰姑娘的“鞋”遍布世界》教案
- 义务教育课程标准实验教科书数学五年级上册
- 新人教版九年级物理全册习题答案
- 积分变换2009年A卷(含答案) - 图文
- 用DIV+CSS实现网页布局及网站设计
- 电商物流最后一公里问题研究
- 计算机基础复习试题及答案
- 必须高度重视基层卫生人才队伍建设
- 江西省基础教育研究课题语文网络阅读申请书 - 图文
- 220KV变电站新建工程绿色施工方案
- 同济大学考研 线性代数知识点(十)
- 1-7章典型例题-v1