| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 769 人关注过本帖
标题:精华区代码Revision-C版本[系列二]
只看楼主 加入收藏
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
结帖率:100%
收藏
已结贴  问题点数:100 回复次数:2 
精华区代码Revision-C版本[系列二]
程序代码:
[原创]进制数据输出的通用程序
*/ --------------------------------------------------------------------------------------
*/ 出自: 编程中国 http://www.*/ 作者: liyun2060 E-mail:blakcuttlefish@*/ 时间: 2007-9-5 编程论坛首发
*/ 声明: 尊重作者劳动,转载请保留本段文字
*/ --------------------------------------------------------------------------------------



昨天看了别人的文章,然后写了一个进制输出的程序,程序实在是太乱了。并且可调试性也很差。于是今天重新写了一个。

进制输出的原理很简单,就是先建一个‘0123456789ACDEF’的数据表

然后根据 除(2,10或者16 这要看你想以什么进制数据形式输出了) 取余,再拿商去除(21016) 再取余的原理。 拿余数跟数据表比较,取得相应的ASCII码。

哎说不清楚,还是看程序吧。自认为程序写的还算清晰明了


;Revision Declare Modified by zaixuexi
;*/ --------------------------------------------------------------------------------------
;*/ source:http://www.
;*/ author:zaixuexi
;*/ date:  2011-11-26
;*/ email: asmedu@
;*/ revision declare:
;*/ 1.add self-estimated c source code
;*/ 2.adjust all asm source code lower-case style.
;*/ 3.keep all original code designment
;*/ --------------------------------------------------------------------------------------


;typedef unsigned char uint8_t;
;typedef unsigned short uint16_t;

;global variable declaration
uint16_t *g_table_t2;

assume cs:codes
codes segment
start:
    mov  ax,cs
    mov  ds,ax          ;code : { *(.text) *(.data) }; (ld scripts syntax)
    mov  ax,0b800h       
    mov  es,ax          ;uint16_t *vga_base = (uint16_t *)0xb800;
    mov  cl,2           ;uint8_t radix = 2;
    mov  dl,011111111b  ;uint8_t value = 0xff;
    call data_turn
    mov  cx,ax          ;uint16_t count = data_turn(ch, i);
                        ;original author used ABI: use register pass parameter, return value in ax.
   
    mov  di,160*10+40   ;uint16_t pos =  160*10+40;
moves:
    mov  ah,[si]
    mov  es:[di],ah
    inc  si             ;vga_base[pos] = *g_table_t2++;
    add  di,2           ;pos += 2;
    loop moves          ;while (count--);
    mov  ah,04ch
    int  21h            ;exit(0);
;/**////////////////////////////////////////////////////////////////////////////////转换程序开始nc
;数制转换通用程序
;功能:将内存中的数据转换成以2进制 16进制 或 10进制 表示的 相应的ASCII码字符串
;进口参数CL 需要转换成的进制
;进口参数DL 被转换数
;出口参数AX 转换后的字符串的长度
;出口参数SI 转换后的字符串的起始偏移地址 段地址为CS

data_turn proc                                    ;uint16_t data_turn(uint8_t value, uint8_t radix);
    jmp turn_start                                ;goto turn_start;
    table_t1 db '0123456789abcdef'                ;const uint8_t *table_t1 = "0123456789abcdef";
    table_t2 db 8 dup(?) ;用来存储转换后的数据    ;uint8_t table_t2[8];
turn_start:
    push ds
    push bx                       ;uint8_t index;
    mov  ax,cs
    mov  ds,ax
    mov  si,7                     ;uint 16_t offset = 7;
    mov  al,dl                    ;uint16_t value = (uint16_t)value;
    cmp  al,0                     ;if (ch == 0) goto dl_zero;
    je   dl_zero ;如果被转换数为0 则直接将0写入table_t2+7处
lp:
    xor  bh,bh
    xor  ah,ah
    div  cl
    mov  bl,ah                    ;index = value % radix; value /= radix;
    mov  bh,table_t1[bx]
    mov  table_t2[si],bh
    dec  si                       ;table_t2[offset--] = table_t1[index];
    cmp  al,0
    je   turn_end                 ;if (value == 0) goto turn_end;
    jmp  lp                       ;goto lp;
dl_zero:
    mov  ds:[table_t2+7],'0'      ;table_t2[offset] = 0x30;
    mov  ax,1                     ;uint16_t return_val = 1;
    lea  si,table_t2   
    add  si,7                     ;g_table_t2 = table_t2 + 7;
    jmp  over                     ;goto over;
turn_end:
    mov  ax,7
    sub  ax,si                    ;index = 7 - offset;
    lea  si,table_t2   
    add  si,8
    sub  si,ax                    ;g_table_t2 = table_t2 + 8 - index;
over:
    pop  bx
    pop  ds
    ret                           ;return return_val;
data_turn endp
;/**//////////////////////////////////////////////转换程序结束
codes ends
end   start

简单评论: 代码结构不是很好,算法思路清晰.
搜索更多相关主题的帖子: 编程论坛 声明 通用 中国 
2011-11-26 15:22
Alar30
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:10
帖 子:988
专家分:1627
注 册:2009-9-8
收藏
得分:100 
来看代码的
谢谢了!
2011-11-27 09:54
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
收藏
得分:0 
好的,有看了不理解的地方,可以随时提出来,大家一起分析学习

技术问题,请不要以短消息方式提问
2011-11-27 09:57
快速回复:精华区代码Revision-C版本[系列二]
数据加载中...
 
   



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

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