| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 9568 人关注过本帖, 1 人收藏
标题:大家来写写匯编小玩意(二)
取消只看楼主 加入收藏
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:340
专家分:2482
注 册:2016-5-15
结帖率:100%
收藏(1)
已结贴  问题点数:20 回复次数:8 
大家来写写匯编小玩意(二)
在别的论坛看见一些有点意思的题目,貼这里让大家练练手。

题目一:
从键盘接收任意字符(长度<=20) ,将其中小写字母以递减方式排序(z......a),
并一次性显示其前后字符,每项资料以空白分隔。
例1:-
输入:12aBb23cD
输出:3cD Bb2 2aB
例2:-
a12z50yw9b8cn34x
2z5 0yw 4x  yw9 cn3 8cn 9b8  a1
另外,因为程序比较简单,希望大家以最短代码完成(不是程式大小),
意即用多少行代码写成。
下面是我用54行完成任务,嗯,应该还有优化的空间。
图片附件: 游客没有浏览图片的权限,请 登录注册


题目二:
已知BUF1中有N1个从小到大的顺序排列互不相等的字符号数,
BUF2中有N2个从小到大的顺序排列互不相等的字符号数,
编写程序将BUF1和BUF2中的数合并到BUF3中,使在BUF3中存放的数互不相等(意即排除相等),
且从小到大的顺序排列。
程式要求:
1.不能另写排序代码(因已排序),先印出buf1及buf2,再印出buf3,均以十进制显示。
2.以最短代码完成(不是程式大小)。

测试数据:
 buf1 db 3,12,14,15,17,19,22,23,88,99,101,105,106,109,202
 buf2 db 1,3,5,6,10,12,14,18,19,21,22,45,101,103,105,106,109

列印结果:
1 3 5 6 10 12 14 15 17 18 19 21 22 23 45 88 99 101 103 105 106 109 202

下面是我用91行完成任务,应该可以再短些。
图片附件: 游客没有浏览图片的权限,请 登录注册


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

[此贴子已经被作者于2016-6-21 20:41编辑过]

搜索更多相关主题的帖子: 键盘 空间 资料 字母 
2016-06-20 13:31
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:340
专家分:2482
注 册:2016-5-15
收藏
得分:0 
回复 2楼 wmf2014
灰常感谢wmf2014班竹参与游戏!
题一,我又想到了优化方法,缩减到42行…
今早起床洗脸时,忽然脑海又闪出另一种完全不同的方法,苦哈哈的敲了键盘30分钟,居然才减了区区一行到41行,好象意思不大,但因为是两种方法,回头整理一下再发上来。
2016-06-22 08:09
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:340
专家分:2482
注 册:2016-5-15
收藏
得分:0 
回复 2楼 wmf2014
汇编果然千变万化,班竹的想法是另辟蹊径,也挺巧妙,利用栈操作,看来反倒不像我的一板一眼。

新的42bytes方案由54bytes那个优化的,就直接说说42bytes吧。

这里用最传统的int21h,0Ah函数读入字符串,取了长度后,直接在输入字符串前后补上空白。利用lodsb读入al,其中比较a-z用了这个方法
sub al,'a'  ;减去ascii, a ->0 .... z ->25
cmp al,25 ;比较是否小写a-z内
若读入'a',减去'a',则字符'a'-'z'会转为值0-25,那么比较一次25就限制在a-z内,不用再2次比较。
mov eax,[si-2] ;取输入区4字节
这里利用32bit代码,直接取该字符前一位置之后4字节入EAX
再由输出区
1)
mov ebx,[di]取输出区4字节
若这EBX为空白,则该输出区为空白,直接放入EAX值,另把第4字节置空白
若EBX不为空白,比较cmp ah,bh,这是比较 [小写] 谁大,
若ah大,则新值置入该[输出区],交换EAX和EBX,新的EAX就是原来较小的值
增加输出区地址add di,4,再跳到1)从新和下值比较,如此就相当于泡泡法排序。
编写下来是42行,代码为了压缩空间,用的是比较新式的.MODEL TINY格式,
须用masm 6.x编译,直接转为

ML /AT ex2.asm

程序代码:
.MODEL TINY
.386    
.code
ORG 100H
start:    mov dx,offset inputBuf 
    mov ax,0c0ah ;清除键盘缓冲,并输入函数
    int 21h
    mov si,offset inputbuf + 2
    xor ecx,ecx
    mov cl,[si-1] ;取输入数
    jcxz quit ;没输入,离开
    mov byte ptr [esi+ecx],20h   ;0d->20h 加空白于后
    mov byte ptr [si-1],20h    ;size->20h ;加空白于前
next:    mov di,offset headbuf + 2
    lodsb    ;取字符
    sub al,'a'  ;减去ascii, a ->0 .... z ->25
    cmp al,25 ;比较是否小写a-z内
    ja next9    ;不是
    mov eax,[si-2] ;取输入区4字节
next1:    mov ebx,[di] ;取输出区4字节
    cmp ebx,20202020h ;是否空白
    jnz next2 ;不是
    stosd ;空白则送到输出区
    mov byte ptr [di-1],20h ;遮罩第4字节成空白
    jmp short next9 ;回圈
next2:    cmp ah,bh ;比较 [该小写] 谁大
    ja next4 ;大于
next3:    add di,4 ;少于则下一个
    jmp short next1
next4:    stosd ;取代输出区项目
    mov byte ptr [di-1],20h ;遮罩第4字节空白
    xchg ebx,eax ;交换二值,eax=原来输出区资料
    jmp short next1 ;再和下一资料比较,即泡泡排序法
next9:    loop next ;回圈 ;  因lodsb 已自动 inc si ;下一输入字节
    mov dx,offset headbuf ;----印结果----
    mov ah,9
     int 21h
quit:    mov ah,4ch ;离开
    int 21h 

 headbuf db 0dh,0ah, 4 * 20 dup (20h),'$'

 inputBuf db 21,0,21 dup(0)
end start  ;-----------代码结束---------------


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

2016-06-22 09:34
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:340
专家分:2482
注 册:2016-5-15
收藏
得分:0 
回复 5楼 wmf2014
班竹很厉害,写得挺不错的,学习了!
slp4:    repnz scasb
    cmp cx,0
    jz  slp2
这里或者可以优化一下,因为停下来一定是找到或找不到,找到zr或找不到nz
slp4:    repnz scasb
    jnz  slp2

若加入32bit写法
mov si,di
sub si,2
这两句可以归纳一句:
Lea si,[edi-2]


另外题目要求20字节内,这程式却没有限制

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

2016-06-22 14:18
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:340
专家分:2482
注 册:2016-5-15
收藏
得分:0 
回复 7楼 wmf2014
在cx次内,找不到会是nz, 找到是zr , cx的值并不决定找寻结果

图片附件: 游客没有浏览图片的权限,请 登录注册
2016-06-22 15:02
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:340
专家分:2482
注 册:2016-5-15
收藏
得分:0 
回复 9楼 wmf2014
呵呵对不起,不是理解错,是di写错了dx
CX不能用来判别找到或找不到是因为有边界条件
若找寻的字符在最后,用cx来判就有问题

图片附件: 游客没有浏览图片的权限,请 登录注册


图片附件: 游客没有浏览图片的权限,请 登录注册


[此贴子已经被作者于2016-6-22 17:33编辑过]

2016-06-22 17:30
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:340
专家分:2482
注 册:2016-5-15
收藏
得分:0 
回复 11楼 wmf2014
厉害厉害,真是为题做码到了无所不用其极的地步!
根据班竹的代码,我做了些简化,共34行

程序代码:
    code segment
    assume cs:code,ds:code,es:code,ss:code
    org 100h
start: xor bl,bl
slp1:  mov al,bl
       mov di,offset buf1
       mov cx,offset buf_len
       repnz scasb
       jnz slp2
       call hexdec
       mov al,20h
       int 29h
slp2:  inc bl
       jnz slp1 
slp3:  mov ax,4c00h
       int 21h
hexdec:mov cx,0 ;清0
       mov bp,10 ;除法准备
Pax1:  mov dx,0 ;清0
       div bp ;ax /10 ,若1234 ,除10后,dl得余数4,
       push dx ;保存, ax=1234,依次保存4,3,2,1
       inc cx ;累加个数
       or ax,ax ;是否已除尽
       jnz Pax1 ;不是,再除
Pax2:  pop ax ;后入先出,先印出第一数,然后第二....
       or al,30h ;转ascii
       int 29h
       loop Pax2 ;下一个
       ret
    buf1 db 3,12,14,15,17,19,22,23,88,99,101,105,106,109,202
    buf2 db 1,3,5,6,10,12,14,18,19,21,22,45,101,103,105,106,109
    buf_len equ $ - offset buf1
    code ends
    end start


[此贴子已经被作者于2016-6-23 18:09编辑过]

2016-06-23 18:06
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:340
专家分:2482
注 册:2016-5-15
收藏
得分:0 
回复 13楼 wmf2014
虽然没碰过,但可以想象到,8BIT的6502、z80汇编,限制更多,带着铁铐跳舞,更考验程式师的技巧!
2016-06-24 13:59
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:340
专家分:2482
注 册:2016-5-15
收藏
得分:0 
忽发奇想,试试用几种高阶语言写写这两题,看哪种代码最短;
嗯,好像python效果不差,题一用了5行,题二用了2行,,应该还有更短的,大家试找一下,那种语言能更短。

题一
python
程序代码:
s=input('please input a string:')
s=' '+ s + ' '                  # add space 
for x in range(122,96,-1):      # z(122)- a(97)
    y=s.find(chr(x),0)          # find x in string, if not found y=-1
    if y != -1: print(s[y-1:y+2],end=' ')     # print result    

图片附件: 游客没有浏览图片的权限,请 登录注册


题二
python
s=(list(set([3,12,14,15,17,19,22,23,88,99,101,105,106,109,202] + [1,3,5,6,10,12,14,18,19,21,22,45,101,103,105,106,109])))
if s.sort() !=-1: print(s)

图片附件: 游客没有浏览图片的权限,请 登录注册


[此贴子已经被作者于2016-7-27 12:05编辑过]

2016-07-25 16:31
快速回复:大家来写写匯编小玩意(二)
数据加载中...
 
   



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

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