首页
社区
课程
招聘
[专题二]汇编程序设计基础
发表于: 2007-12-15 21:36 37364

[专题二]汇编程序设计基础

2007-12-15 21:36
37364

  以下都是一些很基础很基础的课题,一眼就能看出答案来的课题,给初学汇编的新手练习练习,在提高自己的编程能力同时提高自己学习汇编的信心。
  学习任何一门技术,都需要一定的时间,少则三五个月,多则半年甚至一年。感觉学习汇编更是如此,需要很大的兴趣和耐心才能学有所成。刚开始学时,初学者不能急躁(当然我也是一个初学者).
      要学好一门技术,至少得有一本系统详细的教材中,这里说的教材,这不是一般的字典式的教材,那不是真正的教材,那只能用来作工具书用,我们不能没有教材,也不能没有工具书,但是不能把工具书拿来当教材读。真正的教材应该让人看了很在成就感的,写这样的书的作者也是最负责任的,书好不好,看一下目录也可以辨别一二。一本初学者使用的技术型的好书它至少要有习题,有上机,最好还要一二个项目放在书的后面。
  找好教材之后,就要作好数个月深入详细学习的心理了,要真正掌握它,就得经常上机。课本上的例题要上机,自己有想法、有问题的时候也要上机验证一下,还有就是保存好自己写过的所有源代码,这点非常重要,因为它不仅是我们技术进步,经验增加的一种见证,而且也有可能有将来某个时间拿来重用。
     这里说的不能急躁就是说不强求自己一下子把整本书看完,一本好书应该细细的看,把里面的知识全部吸引掉,习题全部做完,上机题也全部做完,前面的内容没有看懂就看后面的,那只能导致越看越不懂,越不懂越不看不下去,到最后把书本一扔,前面的努力全白费了。看这样的一本好书胜过自己蜻蜓点水看几本书。看书不能急,时间充实的话,每天看一二个小时就行了,坚持一个星期,一个月,那收获是非常大的。
  看书时,要学会举一反三、融会贯通的能力,即一个题目修改一下又可以生出一个新的程序来了,一个例题加强一下它的功能它就彻底变成自己的了。
  辛辛苦苦把书看完了,还不够,还要做一些小项目,前面辛辛苦苦(实际上是非常快乐的)的看书,做题,上机,写报告,写总结,不就是为了吸引知识嘛,教材学完了,就该检验一下自己掌握了多少知识,掌握得扎不扎实。项目要求不大,能够实现自己想要实现的功能即可。
  以上仅为本人的一些学习的小心得。欢迎论坛的各位大虾小虾大牛小牛提出批评和建议。
     
[课题2.1] 汇编入门实验报告
内容列表:
实验1  查看CPU和内存,用机器指令和汇编指令编程
http://bbs.pediy.com/showthread.php?t=53710 (1楼)

实验2  用机器指令和汇编指令编程

http://bbs.pediy.com/showthread.php?t=53710 (10/11楼)

实验4  [BX]和loop的使用
http://bbs.pediy.com/showthread.php?t=53710&page=2 (18楼)

实验5 编写、调试具有多个段的程序
http://bbs.pediy.com/showthread.php?t=53710&page=3 (23楼)

实验6 实践课程中的程序
http://bbs.pediy.com/showthread.php?t=53710&page=3 (29楼)

实验7 寻址方式在结构化数据访问中的应用
http://bbs.pediy.com/showthread.php?t=53710&page=4 (34楼)

实验8 分析一个奇怪的程序
http://bbs.pediy.com/showthread.php?t=53710&page=4 (40楼)

实验9 根据材料编程
http://bbs.pediy.com/showthread.php?t=53710&page=5 (42楼)

实验10编写子程序
http://bbs.pediy.com/showthread.php?t=57823

[课题2.2]汇编入门小程序联系1
课题要求:编写3个小程序,要求如下

(1)编写程序,从键盘输入一个字母字符,找出该字母的大写/小写字母前导字母和后续字母,并顺序显示出这3个字母字符。

(2)编写程序,比较两个字符串是否相同,并输出比较结果。

(3)从键盘上输入一个4位十六进制数,分别将该数以十六进制和十进制形式显示出来。

http://bbs.pediy.com/showthread.php?t=57474


[课题2.3] 汇编入门小程序联系2
课题要求:编写3个小程序

(1)在以BUF为起始地址的数组中存入了一个字符串,检测该字符串中是否有数字字符,若有,将DL的D3位置1,否则将该位置0。

(2)从键盘输入一个字符串,分类统计该字符串中字母、数字及其它字符的个数,并显示出分类统计值。

(3)在起始地址为ARRAY的数组中,存入了100个16位带符号数,试求该数组中的最大值、最小值及平均值,并将这3个值显示出来。

http://bbs.pediy.com/showthread.php?p=398261#post398261

[课题2.4]汇编入门小程序联系3
课题要求:编写3个小程序
1.        逆序排列字符串
编写一个通用的子程序来实现逆序排列字符串这个功能。
子程序描述
名称:revers_str
功能:将一个指定的字符串逆序排列
参数:ds:si指向字符串的首地址
返回:无
应用举例:将字符串I Love Masm! 逆序排列并输出屏幕查看结果。

2.        字符串大写转换成小写
字符串大小写转换是日常经常用到的功能,编写一个通用的接口实现大写转换成小写的功能,这个接口使我们更灵活的处理字符串的大小写的转换。字符串必须以0结束。
子程序描述
名称:lowercase
功能:将一个指定的字符串转换成成小写的形式
参数:ds:si指向字符串的首地址
返回:无
应用举例:将字符串I Love 80X86 Assembly Language 转换为小写形式,并输出屏幕查看转换后的字符串。

3.        字符串小写转换成大写
字符串大小写转换是日常经常用到的功能,编写一个通用的接口实现大写转换成小写的功能,这个接口使我们更灵活的处理字符串的大小写的转换。字符串必须以0结束。
子程序描述
名称:capital
功能:将一个指定的字符串转换成大写的形式
参数:ds:si指向字符串的首地址
返回:无
应用举例:将字符串I Love Win32 Assembly Language转换为大写形式,并输出屏幕查看转换后的字符串。

http://bbs.pediy.com/showthread.php?t=57937

[课题2.5]汇编入门小程序联系4
课题要求:编写3个小程序

1. 在一个串中查找给定字符的第一个匹配之处
编写一个通用的子程序来实现在一个串中查找给定字符的第一个匹配之处的功能。字符串必须以0结束,区分大小写。
子程序描述
名称:string_char
功能:在一个串中查找给定字符的第一个匹配之处
参数:(ch)=字符 
                    ds:si指向字符串的首地址
返回:(ax)=匹配的位置
                   (ax)=0表示未找到匹配位置
应用举例:在字符串I Love Masm! 查找M的第一个匹配的位置,并输出测试结果。

2. 字符串拼接
编写一个通用的子程序来实现将源字符串拼接到目的字符串的功能。字符串必须以0结束。
子程序描述
名称:string_cat
功能:将源字符串拼接到目的字符串
参数:ds:si指向源字符串的首地址
                 ds:di指向目的字符串的首地址
返回:无
应用举例:将字符串I Love Win32 Assembly Language!拼接在I Love 80X86 Assembly Language!后面,并输出结果到屏幕上。

3.串比较
编写一个通用的子程序来实现两个字符串的比较的功能。字符串必须以0结束。
子程序描述
名称:string_compare
功能:比较两个字符串
参数:ds:si指向第一个字符串的首地址
                 ds:di指向第二个字符串的首地址
返回:(ah)=0 两个字符串相等
                 (ah)=1 第一个字符串大于第二个字符串
                 (ah)=-1        第一个字符串小于第二字符串
应用举例:比较字符串I Love 80X86 Assembly Language!I Love Win32 Assembly Language!,并在屏幕上输出比较的结果。

http://bbs.pediy.com/showthread.php?t=58757

[课题2.6]汇编入门小程序联系5
课题要求:编写3个小程序

1.  试编写一个程序,要求从键盘接收一个个数数N,然后响铃N次(响铃的ASCII码为07)

2. 编写程序,将一个包含有20个数据的数组M分成两个数组,正数数组P和负数数组N,并分别把这两个数组中的个数显示出来。

3. 编制一个程序,求出首地址为DATA的100D字数组中的最小偶数,并把它存放在AX中。

[课题2.7]汇编入门小程序联系6
课题要求:编写3个小程序

1. 把AX中存入的16位二进制数看作是8个二进制的“四分之一字节“。试编写一个程序,要求数一个值为3(即11B)的四分之一字节数,并将该数在终端上显示出来。

2. 设有一段英文,其字符变量名为MEM,并以$字符结束。试编写一个程序,查找单词MOON在该文本中的出现次数,并以格式”MOON XXXX“显示出次数。

3. 有一个首地址为MEM的100D字数组,试编写程序删除数组中所有为0的项,并将后续项向前压缩,最后将数组的剩余部分补上0。

http://bbs.pediy.com/showthread.php?t=61101

[课题2.8]汇编入门小程序联系7
课题要求:编写3个小程序

1. 数据段中已定义了一个有N个字数据的数组M,试编写一程序求出M中绝对值最大的数,把它放在数据段的M+2N单元中,并将该数的偏移地址存入M+2(N+1)单元中。

2. 试编写一个程序,把AX中的十六进制数转换为ASCII码,并将对应的ASCII码依次存放到MEM数组中的4个字节中。例如,当(AX)=3B85时,程序执行完后,MEM中的4个字节内容为35H、38H、42H和33H。

3. 把0~100D之间的30个数存入以GRADE为首地址的30个字节数组中,GRADE+i表示学号i+1的学生的成绩。另一个数组RANK就为30个学生的名次表,其中RANK+i的内容是学号为i+1的学生的名次。
编写一个程序,根据GRADE中的学生成绩,将学生名次填入RANK数组中。(提示:一个学生的名次等于成绩高于这个学生的人数加1。)

[课题2.9]汇编入门小程序联系8
课题要求:编写3个小程序

1.  已知数组A包含15个互不相等的整数,数组B包含20个互不相等的整数。试编写一个程序,把既在A中又在B中出现的整数存入在数组C中。

2. 设在A、B和C单元中分别存放着3个元素 ,若3个数都不是0,则求出3个数之和并存放于D单元中,若其中有一个数为0,则把其它两个数也清0。

3. 试编写一个程序,要求比较数组ARRAY中的3个16位数,并根据比较结果在终端上显示如下信息:

       (1)如果3个数都不相等则显示0。

       (2)如果3个数有两个数相等则显示1。

       (3)如果3个数都相等则显示2。

[课题2.10]汇编入门小程序联系9
课题要求:编写3个小程序

1.  已定义两个整数变量A和B,试编写一个程序完成下列功能:

       (1)若两个数中有一个是奇数,则将奇数存入A中,偶数存入B中。

       (2)若两个数均为奇数,则将两数均加2后存回原变量。

       (3)若两个数均为偶数,则两个变量都不改变。

2. 假设已编制5个歌曲程序,它们的段地址和偏移地址存入在数据段的跳跃表SINGLIST中。试编写一个程序,根据从键盘输入的歌曲编号1~5,转去执行5个歌曲程序中的某一个。

3. 文件test.txt中有10、20、30、23、45这几个数,试编写一个程序把它们读入内存,并求和,把和存入AX。   

新年新气象,在新的一年里,祝愿大家身体健康,万事如意!


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (49)
雪    币: 271
活跃值: (18)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
2
学习...学习...很好..很强大...
2007-12-16 08:36
0
雪    币: 228
活跃值: (119)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
俺也来顶一下,游戏引擎!
2007-12-16 11:14
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
4
支持!感谢“没有风”能够与大家分享成长的过程,也希望正在学习汇编程序设计的朋友能够参与进来。
2007-12-16 13:14
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我也在学汇编不过现在是越学越没有信心,谢谢楼主了,有点明悟
2007-12-16 17:06
0
雪    币: 1919
活跃值: (901)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
6
谢谢,支持~~~
2007-12-16 17:54
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不错  。。
            总结的不错。。
2007-12-17 12:28
0
雪    币: 486
活跃值: (13)
能力值: ( LV9,RANK:430 )
在线值:
发帖
回帖
粉丝
8
以下为我对[课题2.2](1)的一个解决方案。由于水平有限,所以只能写出这样的程序来。望各位见谅。
[课题2.2](1)解决方案一

;--------------------------------------------------------------------
;name:top2o2.asm
;
;purpose:show the capital or lowercase letter,leader letter and
;        the follow-up letter which based on the letter given by user
;--------------------------------------------------------------------

assume cs:code,ds:data

data segment
 out1      db 'please input a letter:','$'
 out2      db 'the capital/lowercase letter is:','$'
 out3	   db 'the leader letter is:','$'
 out4      db 'the follow-up letter is:','$'
 out5	   db 'press ESC to exit,or any other key to continue!','$'
 c         db 0
 c1        db 0
 leader    db 0
 followup  db 0
data ends

code segment
  start:mov ax,data
        mov ds,ax

      s:
	lea dx,out1
        mov ah,09
        int 21h

        mov ah,01
        int 21h
        mov ds:[c],al

	mov dl,0dh	;换行
	mov ah,02
	int 21h
	mov dl,0ah
	mov ah,02
	int 21h

        mov bh,ds:[c]

	cmp bh,27	;如果是ESC键,退出循环
	jz  e1
        jmp e2
     e1:jmp e
       
      e2:cmp bh,'a'	;判断是否大于'a'
        jz  s0		;等于时跳转到s0执行另一个分支
        cmp bh,'a'	;
        jnc  s3		;大于'a'时跳转到s1判断是否小于'z'
        jmp s0		;不符合条件时跳转到s0

     s3:cmp bh,'z'	;判断是否小于'z'
	jc s1		;小于'z'时跳转到s1
	jmp s0
	 
     s1:sub bh,32	;符合条件则说明c为小写字母,求它的大写字母
        mov ds:[c1],bh
	jmp s2     	;不执行另一分支,直接执行条件分支后面的语句

     s0:cmp bh,'A'	;判断是否大于'A'
        jz  s		;等于'A'时跳转到s3

        cmp bh,'A'	;继续判断是否小于'Z'
        jnc  s4		;大于'Z'则跳转到s3判断是否小于
        jmp s 
     s4:cmp bh,'Z'	;判断是否小于'Z'
        jc  s5		;小于'Z'则跳转到s5处,求小写字母
        jmp s

     s5:add bh,32	;求c的小写字母
        mov ds:[c1],bh

     s2:
	mov bh,ds:[c]
	mov ds:[leader],bh
	mov ds:[followup],bh

	sub byte ptr ds:[leader],1		;求c的前导字母
	add byte ptr ds:[followup],1	;求c的后续字母


	lea dx,out2
        mov ah,09
	int 21h
	mov dl,ds:[c1]	;输出大写/小写字母
	mov ah,02
	int 21h

	mov dl,0dh	;换行
	mov ah,02
	int 21h
	mov dl,0ah
	mov ah,02
	int 21h

	lea dx,out3
	mov ah,09
	int 21h
	mov dl,ds:[leader]	;输出前导字母
	mov ah,02
	int 21h

	mov dl,0dh	;换行
	mov ah,02
	int 21h
	mov dl,0ah
	mov ah,02
	int 21h

	lea dx,out4
	mov ah,09
	int 21h
	mov dl,ds:[followup]	;输出后续字母
	mov ah,02
	int 21h

	mov dl,0dh	;换行
	mov ah,02
	int 21h
	mov dl,0ah
	mov ah,02
	int 21h
	
	lea dx,out5
	mov ah,09
	int 21h
	
	mov dl,0dh	;换行
	mov ah,02
	int 21h
	mov dl,0ah
	mov ah,02
	int 21h
	
	mov dl,0dh	;换行
	mov ah,02
	int 21h
	mov dl,0ah
	mov ah,02
	int 21h

	jmp s

      e:mov ax,4c00h
	int 21h
code ends
end  start


[课题2.2](1)总结:
      刚开始时以为做这个课题很简单,没想到真刀真强的做起来的时候,却又完全是另外一回事了。我先用C写了一个程序,然后将它一点点翻译成汇编,没想到中间遇到的那个挫折啊,我拿着一本字典看了又看,为的只是掌握那个比较指令和那些条件跳转指令,以做出各种条件分支来。刚开始时,总是会出现理解发生偏差的事情来,一个符合要求的条件分支写了改,改了写前前后后花了好几个小时。我感觉还是求前导和后续字母比较简单,不用作什么判断。
  后来我想了个办法,把所有的条件去掉然后输入合法的字母来检测程序运行的正确性,然后才加入各种条件。没想到这个办法还挺管用,居然让我做出来这个程序了。大虾在这里可能要见笑了,可能是练得太少了,所以最后能做出来感到特别兴奋。
2007-12-21 06:43
0
雪    币: 486
活跃值: (13)
能力值: ( LV9,RANK:430 )
在线值:
发帖
回帖
粉丝
9
本周会继续更新课题,欢迎关注本专题:)
2007-12-21 06:57
0
雪    币: 486
活跃值: (13)
能力值: ( LV9,RANK:430 )
在线值:
发帖
回帖
粉丝
10
希望像我一样初学汇编的朋友不要怕,要敢于在众大虾面前“献丑”,要不怕“丢脸”,还要有自信,尽自己所能把课题做出。经验是需要积累的,只有不断的实践才能掌握真正的知识。大虾们不要见笑,也希望你们能够做一下课题,因为你们编程的思路会对初学者产生一定的启发和影响。如果大家有什么好的课题,希望能够把它"捐献"出来,可以通过发发消息把课题给我(不过前提是不能太深了,我怕会吓走大多数人:),之后我再把它补上专题去,好让大家都受益。
2007-12-21 06:57
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
(2)编写程序,比较两个字符串是否相同,并输出比较结果。
以前做过的实验,就贴上了.软件是用EMU8086.不是MASM.
DATA SEGMENT
    STRING1 DB "Anything is possible."    ;定义字符串1
    STRING2 DB "Anything is possible."    ;定义字符串2
    MESS1 DB "Matched",13,10,'$'              
    MESS2 DB "No Matched",13,10,'$'
DATA ENDS
CODE SEGMENT
    ASSUME CS:CODE,DS:DATA,ES:DATA
    START:PUSH DS                        ;DX入栈
          XOR AX,AX                      ;AX清零
          PUSH AX                        ;AX入栈
          MOV AX,DATA            
          MOV DS,AX
          MOV ES,AX
          LEA SI,STRING1                 ;设置源串地址
          LEA DI,STRING2                 ;设置目标串地址
          CLD                            ;设置操作方向DF,从低地址到高地址进行搜索
          MOV CX,21                      ;设置比较字符串的长度,也是循环的长度。
          REPZ CMPSB                        
          JZ MATCH                       ;比较字符串是否相等,相等则跳到MATCH,不相等则顺序执行。
          LEA DX,MESS2                   ;显示字符串为Unmatched
          JMP DISP
MATCH:    LEA DX,MESS1                   ;比较结束后,全部相同显示MESS1,Matched               
DISP:     MOV AH,09H
          INT 21H                        ;显示字符串"Matched",或者是"Unmatched"
ENDS
END START
2007-12-22 23:23
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
code segment
assume cs:code
main:
	mov ah,08h
	int 21h
	cmp al,'a'
	jbe exit
	cmp al,'z'
	jb  next
	cmp al,'A'
	jbe exit
	cmp al,'Z'
	jae exit
next:
	mov dl,al
	dec dl
	mov cx,3
	mov ah ,02h
again:
	int 21h
	inc dl
	loop again
exit:
	mov ah ,4ch
	int 21h
code ends
end main
	

希望与楼主一起成长
2007-12-31 08:20
0
雪    币: 211
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
`你收集的还真多``支持哦...
2008-1-3 17:50
0
雪    币: 486
活跃值: (13)
能力值: ( LV9,RANK:430 )
在线值:
发帖
回帖
粉丝
14
现在的仅仅是我目的的1/3啊,所以还有一段路要走下去啊。
2008-1-8 23:29
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
哈哈
终于找到了如此一个让人爱不释手的好贴了
2008-1-12 13:15
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
恒心、毅力、勤奋 的 典范 赞个
吾菜鸟要学而常习之。
2008-1-14 21:21
0
雪    币: 205
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
找这样的资料很久了,谢谢楼主
2008-1-16 17:52
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
这个东西要学习学习、确实不错。
2008-1-20 18:00
0
雪    币: 109
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
为什么我的机器双核 的装不了win32编译器masm32 v9.0
2008-1-20 19:26
0
雪    币: 109
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
为什么我的机器双核 的装不了win32编译器masm32 v9.0
2008-1-20 19:26
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
汇编编译器有很多,没必要一定要装MASM。
2008-1-22 15:18
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
haojiubushan好久不上来了。这里现在这么热闹啊
2008-2-10 19:49
0
雪    币: 134
活跃值: (84)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
23
很厉害啊。学习了。
2008-2-12 16:09
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
我不懂汇编,但是我一定要学好它,顶一下
2008-2-13 22:14
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
自己没有电脑,什么时间想看了,只能看看书,写出来的东西也不能!!!
2008-2-14 10:45
0
游客
登录 | 注册 方可回帖
返回
//