标题:大家来写写汇编小玩意(四)
只看楼主
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:337
专家分:2462
注 册:2016-5-15
结帖率:100%
已结贴  问题点数:20 回复次数:6 
大家来写写汇编小玩意(四)
之前的小玩意(三)
https://bbs.bccn.net/thread-466366-1-1.html
两条题目对初学者可能比较复杂些,这次来两个简单的。

题目一
先看这一贴
https://bbs.bccn.net/thread-466557-1-1.html
AT&A的语法对一般学生较陌生,可MOV指令却不陌生吧,于是忽然想起一题。

1.写一个程式只能用MOV指令(不能用任何其他指令如push,int等),在屏幕显示hello,并正常退回dos。
2.伪指令比如code segment或end start等框架不算指令。




题目二
求任意两个字符串的[最长]公共子串及长度(串长<80), 并输出其子串和长度。
若没有该子字串,印出 no match !

要求:
-字符串由用户输入,子串长度10进制显示
-空格不视作相同
-字符串头尾空格不计
例子:
输入:
句子1:this is my book, please !
句子2:please give your book to me.

输出:
match string:please
String Length:6

一如既往,我也写了一个。



有趣兴可以写写,贴出代码,或者说说想法也可以。















[此贴子已经被作者于2016-7-3 08:57编辑过]

搜索更多相关主题的帖子: 伪指令 字符串 hello start 
2016-07-03 07:59
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:20 
第一题已经很难了好不!我所了解的mov指令也就是传送数据的功能,该怎么返回呢?我所想到的大概就是计算好自己目标代码的长度,往紧接着的指令区域写cd 21h数据,间接执行int 21h(或ret指令)了。
第二题简单些,好多c语言有类似题目,把c里面的指针换成汇编里的间址寻址就行了,如mov al,[si+bx] cmp [di+bx],al等,我想大概两层循环后留下长度最长的和si指向即可,需要注意的是当目标字符和源字符必须比较到最后(如源字符里有xxxxxx,目标字符里有x xx xxx xxxx xxxxxx xxxxxxxxx)

[此贴子已经被作者于2016-7-3 11:03编辑过]


能编个毛线衣吗?
2016-07-03 11:00
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:337
专家分:2462
注 册:2016-5-15
得分:0 
回复 2楼 wmf2014
很好,方向都对了。

题二我写了百多行,要注意的是找最长,不能找对了就停,还有边界问题。

其他朋友可以试试,或者嫌我的题目不好写或不对味,也可以出个题目让大家玩玩,但不能随便丢个习题而自己没有一点想法或代码,纯粹伸手党大家应该会分辨的。
2016-07-03 17:18
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:337
专家分:2462
注 册:2016-5-15
得分:0 
想了想,单单mov可以印出hello,别的指令有没有如此厉害呢?嗯,好象没有,但单一个没有,两个总可以吧,兄弟同心,其利断金,于是push/pop上场了!

题一追加题:
1.写一个程式只能用push/pop指令(不能用任何其他指令如mov,int等),在屏幕显示hello,并正常退回dos
2.伪指令比如code segment或end start等框架不算指令。
2016-07-03 23:24
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:337
专家分:2462
注 册:2016-5-15
得分:0 
题一,大家好像没啥兴趣,大概是太简单了。
这是纯用mov在屏幕中央显示hello,利用es:di写显存,然后直接把mov ah,4ch和int21h写入程式段。
当然还有其他写法,我也试了好几种,下面是其中之一。

程序代码:
code segment
assume cs:code
start:      
     mov ax,0b800h      ;显存
     mov ds,ax
     mov ah,04        ;颜色
     mov al,68h    ;h
     mov di,80*2*12 + 35*2  ;屏幕中央
     mov word ptr [di],ax

     mov al,65h    ;e
     mov di,80*2*12 + 36*2
     mov word ptr [di],ax

     mov al,6ch    ;l
     mov di,80*2*12 + 37*2
     mov word ptr [di],ax

     mov al,6ch    ;l
     mov di,80*2*12 + 38*2
     mov word ptr [di],ax

     mov al,6fh    ;o
     mov di,80*2*12 + 39*2
     mov word ptr [di],ax 

     mov bx,offset quit    ;偏移地址
     mov word ptr cs:[bx],4cb4h    ;mov ah,4ch 
     mov word ptr cs:[bx+2],21cdh    ;int 21h
quit:
    code ends
    end start




这是纯用push /pop

程序代码:
.286
code segment
assume cs:code
start:      
     push     word ptr 6568h    ;he
     pop     word ptr ds:[80h]    ;pop 入psp:80
     push     word ptr 6c6ch    ;ll
     pop     word ptr ds:[80h+2]
     push     word ptr 246fh    ;o$
     pop     word ptr ds:[80h+4]
     push     80h            ;压80h入栈
     pop     dx            ;弹出至dx
     push     word ptr 0900h    ;mov ah,9
     pop     ax
     push     word ptr 21cdh    ;int 21
     pop     word ptr cs:[$ + 21]
     push     word ptr 4cb4h    ;mov ah,4ch
     pop     word ptr cs:[$ + 15]
     push     word ptr 21cdh    ;int 21
     pop     word ptr cs:[$ + 9]
code ends
end start



[此贴子已经被作者于2016-7-6 14:38编辑过]

2016-07-06 14:32
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:0 
回复 5楼 Valenciax
今天才知道可以可以push立即数,反正我在debug里怎么都写不出这个汇编指令。
好几天没上论坛了,抽空做下第二题。

能编个毛线衣吗?
2016-07-07 17:14
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:337
专家分:2462
注 册:2016-5-15
得分:0 
回复 6楼 wmf2014
https://bbs.bccn.net/thread-466735-1-1.html
这贴下载包里有,这个版本接受32bit指令
2016-07-07 19:38



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-466575-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.493948 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved