| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 9804 人关注过本帖, 1 人收藏
标题:大家来写写匯编小玩意(二)
只看楼主 加入收藏
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
怎么没人做第二题呢?大概还是冷清的原因。
根据题意,这题首先要解决十六进制转十进制显示的问题。其次再是显示过滤后的数据。显示需要的数据真不需要排序,有两个方法解决:
1,查表法,由于是一个字节的数据,因此可以使用一个256字节的表格,通过一次性扫描,在表格里建立数据存在标志,显示是按顺序扫描表格只显示有标志的字节编号。优点是只需扫描一次,速度快,缺点是需要内存空间建立表格。
2,试探法,用一个计数器从0-255计数,逐个判断是否和数据缓冲里的数据相等,相等则显示,不等继续计数。优点是不需要多余内存空间,缺点是要扫描256次数据区。
下述用47行代码能满足楼主要求:
程序代码:
    code segment
    assume cs:code,ds:code,es:code,ss:code
    org 100h
start:    xor bl,bl
    cld
slp1:    mov al,bl
    mov di,offset buf1
    mov cx,offset buf3+1
    sub cx,di
    repnz scasb
    cmp cx,0
    jz slp2
    call hexdec
slp2:    cmp bl,255
    jz slp3
    inc bl
    jmp slp1 
slp3:    mov ax,4c00h
    int 21h
hexdec:    pushf      ;一个字节的十六进制转换为十进制并显示出来,待转换数据在ax中
    push dx    ;根据本程序完全不需要push dx,但写函数起码的习惯是保存要用的寄存器
    push di
    mov di,offset buf3+3
    std
hdlp2:    mov byte ptr[di],20h
    xor ah,ah
    cmp ax,0
    jz  hdlp1  ;ax=0转换结束
    div buf4
    xchg al,ah
    add al,'0'
    stosb
    xchg al,ah
    jmp hdlp2
hdlp1:    mov ah,9
    mov dx,di
    int 21h
    pop di
    pop dx
    popf
    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
    buf3 db 4 dup(20h),'$'
    buf4 db 10  ;除数
    code ends
    end start

能编个毛线衣吗?
2016-06-23 17:12
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
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 12楼 Valenciax
厉害!
我崇拜算法,也喜欢技巧,但8088汇编已经nnnn年没弄了(早期最熟悉6502、z80汇编),不熟练就不能灵活使用技巧,向你学习。

能编个毛线衣吗?
2016-06-23 21:08
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
Alar30
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:10
帖 子:988
专家分:1627
注 册:2009-9-8
收藏
得分:0 
不错不错哈。。。
2016-10-21 10:26
dongdon923
Rank: 2
等 级:论坛游民
威 望:1
帖 子:17
专家分:58
注 册:2016-12-2
收藏
得分:0 
路过而学习了
2016-12-12 14:03
shanxidls
Rank: 1
来 自:山西运城
等 级:新手上路
帖 子:12
专家分:0
注 册:2017-5-14
收藏
得分:0 
好贴!虽然看不懂,但我们这菜类就需要这些东西。希望多发此类代优秀好文档

近年倒霉走麦场遭遇恐怖已六载跟踪迫害是常事网上捣乱家常饭
2017-05-15 18:56
快速回复:大家来写写匯编小玩意(二)
数据加载中...
 
   



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

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