能力值:
( LV9,RANK:430 )
26 楼
由于拖了几天,太过勿忙了,想快点完成报告,所以如果我的报告有什么错误的话,请原谅。
能力值:
( LV9,RANK:430 )
27 楼
谢谢3楼同志的支持。/
能力值:
( LV13,RANK:530 )
28 楼
奥.16位汇编~~~~完全不懂得说
能力值:
( LV9,RANK:430 )
29 楼
实验6 实践课程中的程序
(1) 将课程中所有讲解过的程序上机调试,用DEBUG跟踪其执行过程,并在过程中进一步理解所讲内容。
(2) 编程:完成问题中的程序。
问题:编程,将datasg段中的每个单词的前四个字母改为大写字母:
;---------------------------
;pro9.asm
;---------------------------
;AUTHOR:没有风
;DATE:2007/11/18
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;功能:将4个单词的前4个字母转换为大写字母
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;语言:8086,编译工具:masm5.00
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
assume cs:codesg,ss:stacksg,ds:datasg stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg ends datasg segment
str0 db '1. display '
str1 db '2. brows '
str2 db '3. replace '
str3 db '4. modify '
datasg ends codesg segment
start: mov ax,stacksg
mov ss,ax
mov sp,16 mov ax,datasg
mov ds,ax mov bx,0
mov cx,4 s0: push cx
mov si,0
mov cx,4 s: mov al,[bx+3+si]
and al,11011111b
mov [bx+3+si],al
inc si
loop s add bx,16
pop cx
loop s0 mov ax,4c00h
int 21h
codesg ends
end start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;总结:经过实战编写上面的程序,我
;1。学会了如何使用二重循环
;2。学会了如何定义并使用二维数组
;3。学会了如何使用行指针和列指针来遍历所要遍历的数组元素
;4。更深入的了解了如何使用一个寄存器来作为二重循环的计算器
;5。更深入的懂得了堆栈的原理及功能(用来暂存数据)
;6。学会了使用MOV指令逐字节的读取数组的元素来对数组赋值
;7。希望在上面的程序里加入三个功能:(1)把数组转换4个字母修改为全部字母(2)在转换字母前打印菜单(3)在转换字母后打印菜单
;8。希望日后往这个程序里添加里一些具体的有实际意义的功能,比如将它修改为一个学生管理系统,可以存储一定数量学生数据,并可以
; 将数据保存到硬盘中,以及从硬盘中读取这些数据,同时可以对这些数据进行增加、修改、删除等操作。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;日期:2007/11/18 20:28
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
能力值:
( LV9,RANK:430 )
30 楼
我的帖子也能加精,真是想不到啊,有点兴奋过头了。
能力值:
(RANK:1010 )
31 楼
能够坚持下来,而且愿意与大家分享。
得精华理所应当!
继续努力!
能力值:
( LV9,RANK:430 )
32 楼
是论坛帮助了我学习才对。
能力值:
( LV9,RANK:430 )
33 楼
由于内容太多,在些仅给出源代码。想详细阅读报告的朋友可以下载附件。
能力值:
( LV9,RANK:430 )
34 楼
汇编实验报告七
由于内容太多,在此仅给出源代码。想详细阅读报告的朋友可以下载附件。
;-----------------------------------------------------------------------------------
;exp7b.asm
;-----------------------------------------------------------------------------------
;AUTHOR:没有风
;DATE:2007/12/3
;-----------------------------------------------------------------------------------
assume cs:code,ds:data,ss:stack,es:table
stack segment ;定义一个堆栈段,用来暂存寄存器的值
dw 16 dup(?)
stack ends
data segment
year db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
income dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
employeenum dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
data ends
table segment
list db 21 dup ('year summ ne ?? ') ;定义一个长度为21的结构体数组,每个结构体有4个成员
table ends ;分别是年份、总收入、人数、人均收入
code segment
start: mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov ax,stack
mov ss,ax
mov sp,32
mov bx,0
mov si,0
mov di,0
mov cx,21
s: mov ax,84[di] ;取84地址开始的元素,即被除数的低16位
mov dx,86[di] ;取86地址开始的元素,即被除数的高16位
div word ptr 168[si] ;求公司里每年的人均收入
push ax
mov ax,[di] ;send the year to table segment
mov es:[bx],ax
mov ax,[di].2
mov es:[bx].2,ax
mov ax,84[di] ;send the income to the table segment
mov es:[bx].5,ax
mov ax,84[di+2]
mov es:[bx].7,ax
mov ax,168[si] ;send the employee number to the table segment
mov es:[bx+10],ax
pop ax
mov es:[bx].13,ax ;把商传送到table段中相应内存去,以C的风格访问结构体元素
add di,4
add si,2
add bx,16
loop s
mov ax,4c00h
int 21h
code ends
end start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
上传的附件:
能力值:
( LV2,RANK:10 )
35 楼
下载中,多谢分享
能力值:
( LV2,RANK:10 )
36 楼
学习一下哈哈哈
能力值:
( LV2,RANK:10 )
37 楼
实验七的报告我怎么看不到附件啊!??
能力值:
( LV9,RANK:430 )
38 楼
楼上朋友不知道能下没有,看不到附件我也不知道是怎么回事啊。因为我也看不到啊。
能力值:
( LV2,RANK:10 )
39 楼
好帖呀,学习了。
能力值:
( LV9,RANK:430 )
40 楼
实验8 分析一个奇怪的程序
分析下面的程序,在运行前思考:这个程序可以正确返回吗?
通过这个程序加深对相关内容的理解。
;-------------------------------------------------------------------------------
;exp8.asm
;DATE:2007/12/13
;-------------------------------------------------------------------------------
assume cs:codesg
codesg segment
mov ax,4c00h
int 21h
start:mov ax,0
; 占用一个字节的空间,关键,用来添加指令用
s:nop
; 占用一个字节的空间,关键,用来添加指令用
nop
;把标号s处的偏移地址(0008H)传送到DI寄存器
mov di,offset s
mov si,offset s2 ;把标号S2处的偏移地址(0020H)传送到SI寄存器
mov ax,cs:[si] ;把代码段处偏移地址为(si)的内容(0F6EBH,即指令JMP SHORT S翻译后为JMP 0008H)传送到AX寄存器,即把标号S2处的指令传送到AX寄存器(关键)
mov cs:[di],ax ;把AX内容传送到标号S处(S处有两个字节空间可以用来存入一条指令,关键),相当于在S处添加一条指令JMP SHORT S,机器码为0F6EBH,不过翻译后变为JMP 0000H(好奇怪哦,由原来的JMP 00008H变成这个样子了)
s0:jmp short s ;跳转到标号S处执行指令,实际上在上面已经把指令jmp short s复制到了标号S处,因为S为位移值,而不是一个偏移地址,所以执行该指令时,IP寄存器的内容被修改为:S处第二条指令的地址
s1:mov ax,0
int 21h ;(此处指令求被执行)
mov ax,0 ;(此处指令求被执行)
s2:jmp short s1 ;跳转到标号S1处执行指令,汇编为机器码为0EBF6H,经编译器翻译后为JMP 0018H,关键
nop
codesg ends
end start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov di,offset s
mov si,offset s2
这两条指令的功能是把源内存单元的和目的内存单元的偏移地址传送到相应寄存器中去
mov ax,cs:[si]
mov cs:[di],ax
这两条指令的功能是将源内存单元的指令传送到目的内存单元中去
将源内存单元的指令jmp short s1 传送到目的去,确切的说应该是将机器指令EBF6H(jmp short s1被DEBUG翻译后的机器码)传送到目的内存单元去.这时,DEBUG把这个机器指令解释出来后,并不是我们原来看到的jmp short s1,因为F6H对应的有符号数为-10D,即当执行jmp short s返回s处执行EBF6H指令时,IP的内容加上JMP指令的长度为10,此时再减去10D,正好CS:IP指向mov ax,4c00h这条指令,接着往下执行程序顺利结束。因此程序可以正常返回。
学了好久,才终于将实验8写完,感觉问题是弄明白了,可是说出来又要让懂的人明白却不是那么容易的一回事。
能力值:
(RANK:10 )
41 楼
支持楼主.坚持.
能力值:
( LV9,RANK:430 )
42 楼
实验9 根据材料编程
这个编程任务必须在进行下面的课程之前独立完成,因为后面的课程中,需要通过这个实验而获得的编程经验。
编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串’welcome to masm!’.
编程所需的知识通过阅读、分析下面的材料获得。
80*25彩色字符模式显示缓冲区(以下简称为显示缓冲区)的结构:
内存地址空间中,B8000H~BFFFFH共32KB的空间,为80*25彩色字符模式的显示缓冲区。向这个地址空间写入数据,写入的内容将立即出现在显示器上。
在80*25彩色字符模式下,显示器可以显示25行,每行80个字符,每个字符可以有256种属性(背景色、背景色、闪烁、高亮等组合信息)。
这样,一个字符在显示缓冲区中就要占两个字节,分别存放字符的的ASCII码属性。
80*25模式下,一屏的内容在显示缓冲区中共占4000个字节。
显示缓冲区分为8页,每页4KB(约等于4000B),显示器可以显示任意一页的内容。一般情况下,显示第0页的内容。了就是说通常情况下,B8000H~B8F9F中的4000个字节的内容将出现在显示器上。
在一页显示缓冲区中:
偏移000~09F对应显示器上的第1行(80个字符占160个字节):
偏移0A0~13F对应显示器上的第2行:
偏移140~1DF对应显示器上的第3行。
依此类推,可以偏移F00~F9F对应显示器上的第25行。
即在一行中:
00~01单元对应显示器上的第1列。
02~03单元对应显示器上的第2列。
04~05单元对应显示器上的第3列。
依此类推,可知,9E~9F单元对应显示器上的第80列。
例如:在显示器的0行0列显示黑底绿色的字符串‘ABCDEF’
(‘A’的ASCII码值为41H,02H表示黑底绿色)
显示缓冲区里的内容为:
00 01 02 03 04 05 06 07 08 09 0A 0B 。。。0E 0F
B800:0000 41 02 42 02 43 02 44 02 45 02 46 02 。。。 。。
。
。
B800:00A0 。。 。。 。。 。。 。。 。。 。。 。。 。。 。。 。。 。。 。。
可以看出,在显示缓冲区中,偶地址存放字符,奇地址存放字符的颜色属性。
一个在屏幕上显示的字符,具有前景(字符色)和背景(底色)两种颜色,字符还可以以高亮度和闪烁的方式显示。前景色、背景色、闪烁、高亮等信息被记录在属性字节中。
属性字节的格式:
7 6 5 4 3 2 1 0
含义 BL R G B 1 R G B
闪烁 背景 高亮 前景
R:红色
G:绿色
B:蓝色
我们可以按位设置属性字节,从而配出各种不同的前景色和背景色。
比如: 红底绿字,属性字节为:01000010B;
红底闪烁绿字,属性字节为:11000010B;
红底高亮绿字,属性字节为:01001010B;
黑底白字,属性字节为:00000111B;
白底蓝字,属性字节为:01110001B;
例:在显示器的0行0列显示红底高亮闪烁绿色的字符串‘ABCDEF’
(红底高亮闪烁绿色,属性字节为:11001010B,CAH)
显示缓冲区里的内容为:
00 01 02 03 04 05 06 07 08 09 0A 0B 。。9E 9F
B800:0000 41 CA 42 CA 43 44 CA 45 46 CA 。。。 。。 。。。。。
。
。
B800:00A0 。。 。。 。。 。。 。。 。。 。。 。。 。。 。。 。。 。。 。。
注意:闪烁的效果必须在全屏DOS方式下才能看到。
解决方案一:
;----------
;exp9.asm
;----------
;---------
;purpose:print 3 strings in the middle of screen by different colors
;---------
assume cs:code,ds:data
data segment
string0 dw 0277h,0265h,026ch,0263h,026fh,026dh,0265h,0220h,0274h,026fh,0220h,026dh,0261h,0273h,026dh,0221h
string1 dw 2477h,2465h,246ch,2463h,246fh,246dh,2465h,2420h,2474h,246fh,2420h,246dh,2461h,2473h,246dh,2421h
string2 dw 7177h,7165h,716ch,7163h,716fh,716dh,7165h,7120h,7174h,716fh,7120h,716dh,7161h,7173h,716dh,7121h
data ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,0b800h
mov es,ax
lea si,string0
mov di,071Eh
mov cx,16
s0:
mov bx,[si]
mov es:[di],bx
add di,2
add si,2
loop s0
lea si,string1
mov di,07BEh
mov cx,16
s1:
mov bx,[si]
mov es:[di],bx
add di,2
add si,2
loop s1
lea si,string2
mov di,085Eh
mov cx,16
s2:
mov bx,[si]
mov es:[di],bx
add di,2
add si,2
loop s2
mov ax,4c00h
int 21h
code ends
end start
实验总结:
实验总共花了我十多天的时间才完成(中间断断续续的写了改,改了写程序,最近有太多事要忙了
),中间除了思索用什么方式完成功能之外,也在不断的调试BUG。程序要求用自己的方式将彩色字符串输出来,而不是调用中断输出。我考虑过在字符串后面加上一个终止符(随意一个特殊点的字符都行,读取到该字符时停止就行),不用说这个程序肯定要用循环来实现的,刚开始我想用一个循环将三个字符串输出,可是调试时BUG不断,原来保存字符串的方式也不太对,因为是一个字符对应一个属性,较好的方式就是将用字型数组来保存这三个字符串,这样我们要做的工作就是不断的读取这些字符并传送到显存中去即可。
中间走了一些弯路,如最后发觉用比较简单的方式就是用三个循环实现,前面我想用一个循环发觉不是不行,只是有一点点难度,要考虑变换段地址,判断是否读取完一个字符串,考虑条件跳转等因素。
为了尽快完成实验,我采取了我最能接受的方式,就是用三个循环来实现实验要求的功能,这样要做的变换只是每一次循环前要做的工作就是改变一下输出字符串开始的行和列就可以了。
能力值:
( LV2,RANK:10 )
43 楼
为啥实验3:无,郁闷
能力值:
( LV2,RANK:10 )
44 楼
一直在学习中
请问楼主从实验4开始用的是什么编译器?
不会一直是在debug模式下写的吧?
能力值:
( LV9,RANK:430 )
45 楼
我目前一直是用记事本和MASM5+DEBUG写的程序啊。
能力值:
( LV9,RANK:420 )
46 楼
你确实应该写一个关于编译器的报告了
我推荐RadASM
能力值:
( LV2,RANK:10 )
47 楼
昨天在网上查找了哈
现在用RadASM,只是用了它的编辑界面
调试,查看内存中内容还是用的debug,还不知道在RadASM里面怎么看到内存信息
能力值:
( LV2,RANK:10 )
48 楼
配合王爽老师的《汇编语言》看,可能效果更好些。
原来学微机原理的时候学了哈汇编,不过快3年没用都忘光了,现在争取快点捡起来
呵呵~~
能力值:
( LV2,RANK:10 )
49 楼
实验5.4 我写的程序
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
ca segment
db 0,0,0,0,0,0,0,0
ca ends
code segment
start:
mov ax,a ;用两个循环实现
mov es,ax
mov ax,ca ;最终数据放到ds段中
mov ds,ax
mov bx,0
mov cx,8
s1: mov al,es:[bx] ;将a段中的先加到c段中去
add [bx],al
inc bx
loop s1
mov ax,b
mov es,ax
mov bx,0
mov cx,8
s2:mov al,es:[bx] ;将b段中的先加到c段中去
add [bx],al
inc bx
loop s2
mov ax,4c00h
int 21
code ends
end start
-----------------------
请问楼主的程序中 di 是用来干什么的?
能力值:
( LV2,RANK:10 )
50 楼
支持一下了,可我没有看见图在那里啊,