. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->汇编语言学习交流区
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  一个显示汉字的代码  [待解决] 回复[ 12次 ]   点击[ 1059次 ]  
startasm
[帖 主]   [ 发表时间:2007-12-12 09:15 ]   [引用]   [回复]   [ top ] 
荣誉值:50
信誉值:0
注册日期:2007-11-27 20:05
初学,还看不懂这个程序,不过觉的显示汉字很好完,希望高手能帮分析一下
运行能显示一个汉字“好”。

assume cs:code, ds:data 
data segment 
s1 DB 0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
   DB 0,0,0,3,3,3,0,0,0,0,0,0,0,0,0,3,3,0,0,0 
   DB 0,0,0,3,3,0,0,0,0,3,3,3,3,3,3,3,3,0,0,0 
   DB 0,0,0,3,3,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0 
   DB 0,0,0,3,3,0,3,3,3,0,0,0,0,3,3,0,0,0,0,0 
   DB 0,3,3,3,3,3,3,3,0,0,0,0,3,3,0,0,0,0,0,0 
   DB 0,0,0,3,3,0,3,3,0,0,0,0,3,3,0,0,0,0,0,0 
   DB 0,0,3,3,0,0,3,3,0,0,0,0,3,3,0,0,0,0,0,0 
   DB 0,0,3,3,0,0,3,3,0,0,0,0,3,3,0,0,3,3,3,0 
   DB 0,0,3,3,0,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0 
   DB 0,0,3,3,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,0 
   DB 0,3,3,0,0,3,3,0,0,0,0,0,3,3,0,0,0,0,0,0 
   DB 0,0,3,3,3,3,3,0,0,0,0,0,3,3,0,0,0,0,0,0 
   DB 0,0,0,0,3,3,3,3,0,0,0,0,3,3,0,0,0,0,0,0 
   DB 0,0,0,3,3,0,3,3,3,0,0,0,3,3,0,0,0,0,0,0 
   DB 0,0,3,3,0,0,0,3,3,0,0,0,3,3,0,0,0,0,0,0 
   DB 0,3,3,0,0,0,0,0,0,0,3,3,3,3,0,0,0,0,0,0 
   DB 3,3,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0 
   DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
   DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
cnt1   db 20 
cnt2   db 20 
data ends 
code segment 
start: 
  mov ax, data 
  mov ds, ax 
  mov ah, 00h 
  mov al, 04h 
  int 10h 
  mov ah, 0bh 
  mov dh, 01h 
  mov dl, 00h 
  int 10h 
  xor di, di 
  mov ah, 0CH 
  mov dx, 50 
  mov cnt1, 20 
LL1: 
  mov cx, 50 
  mov cnt2, 20 
LL2: 
  cmp [s1+di], 2 
  jl black 
  mov AL, 1 
  jmp rets 
black: 
  mov AL, 0 
rets: 
  int 10h 
  INC DI 
  INC CX 
  DEC [cnt2] 
  jnz LL2 
  INC DX 
  DEC [cnt1] 
  jnz LL1 

;============================ 
exit: 
  mov ah, 7 
  int 21h 
  mov ah, 4ch 
  int 21h 
code ends 
end start
wdm
[第1楼]   [ 回复时间:2007-12-12 12:53 ]   [引用]   [回复]   [ top ] 
荣誉值:342
信誉值:0
注册日期:2007-12-06 10:21
初学为什么要看这种程序?
回头去看汇编语言吧!放着慢慢研究。
zysong
[第2楼]   [ 回复时间:2007-12-12 14:47 ]   [引用]   [回复]   [ top ] 
荣誉值:19
信誉值:0
注册日期:2007-07-05 17:25
大体思路是图形模式下,打印相应的点阵,用像素点形成一个汉字。S1程序段你仔细看就是一个汉字。
startasm
[第3楼]   [ 回复时间:2007-12-13 16:58 ]   [引用]   [回复]   [ top ] 
荣誉值:50
信誉值:0
注册日期:2007-11-27 20:05
有点好奇心;-)

我再查查,学过点ibm就是为了过考试没有记住什么。等我学完汇编一定自己弄个汉字库~
mouse
[第4楼]   [ 回复时间:2007-12-14 12:22 ]   [引用]   [回复]   [ top ] 
荣誉值:472
信誉值:12
注册日期:2007-10-16 15:34
等我完成了课设一后弄弄,不错的例子,支持下
先收藏了~
abcabc
[第5楼]   [ 回复时间:2007-12-27 13:24 ]   [引用]   [回复]   [ top ] 
荣誉值:24
信誉值:3
注册日期:2007-06-06 11:53
好例子,收藏了
startasm
[第6楼]   [ 回复时间:2008-01-05 13:26 ]   [引用]   [回复]   [ top ] 
荣誉值:50
信誉值:0
注册日期:2007-11-27 20:05
就是啊,挺好玩的~
mess
[第7楼]   [ 回复时间:2008-03-27 10:21 ]   [引用]   [回复]   [ top ] 
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48
有意思,显示汉字啊~
xiaochong
[第8楼]   [ 回复时间:2008-03-28 10:34 ]   [引用]   [回复]   [ top ] 
荣誉值:45
信誉值:0
注册日期:2007-05-05 09:01
原理是在通过
mov al, 04h  
int 10h  中断设置为图形显示模式,然后根据像素点,拼成一个汉字,仅此而已!
asan1535
[第9楼]   [ 回复时间:2008-04-20 23:40 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-04-18 23:25
这就是LED显示原理程序吧~哈哈~~终于找到了~~顶了!
szborn2be
[第10楼]   [ 回复时间:2008-05-22 21:32 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-05-22 20:46
我已在中国DOS联盟论坛上将它扩展成了“24x32点阵汉字缩放演示程序”
功能如下:
ZOOM24.COM----24x32点阵
     汉字缩放演示器
   (C) Mar. 10, 2008
设计: 苏州(本是)罗明安
(email: born2be@126.com)
   由小数字区键控制,
     各键功能如下:

      Esc=退出
  4=横缩1   8=纵缩1
  6=横扩1   2=纵扩1
  7=4+8     3=2+6
  1=4+2     9=6+8
  -=慢速    5=最小
  +=快速    回车=最大
  0=显背景  *=显前景
  .=隐背景  /=隐前景

附件(http://rtngslin.moe.hm/cndos-up/img/087.rar)中,
zoom24.com    DEMO执行文件
zoomread.com  DEMO说明汉字自显示程序
zoomread.txt  DEMO说明汉字文本
szborn2be
[第11楼]   [ 回复时间:2008-05-22 21:48 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-05-22 20:46
另:[F1]功能键显示最简帮助行。

zoom24.com程序中运用了许多技巧,比如汉字字模的解拆至比特、缩放、VGA寄存器快速写点、4重FOR循环、内存地址/指令直接修改等……所以执行程序未压缩未加密时只有654字节!
源代码也干脆给你们了!

.286p
code segment byte public
  assume cs:code,ds:code,es:code
  org 100h
Start:
  cld
  mov si,offset s1
  mov di,offset s2
  mov ch,24
l1:mov cl,4
  l2:lodsb
    mov bl,al
    mov dh,8
    l3:xor ax,ax
      rcl bl,1
      jnc i0
      inc ax
    i0:shl ax,1;0;2
      inc ax   ;1;3
      stosw
      dec dh
    jnz l3
    dec cl
  jnz l2
  dec ch
jnz l1

again:
  mov $DataCtr,2

  mov ax,12h  ;SCREEN 12
  int 10h
;
  xor bp,bp
  dec bp
  mov I,bp  ;FOR i = 0 TO 23
ForLoop_01:inc I
  mov ax,I
  cmp al,23 ;jle $+3 ;;ForLoop_01_Ok
  jg Next_01;jmp Next_01 ;;ForLoop_01_Ok:
  mov ax,Z
  mov bx,I
  imul bl
  add ax,X;;tho DEL-able for x=0
  mov A,ax ;a=z*i+x
  mov J,bp  ;FOR j = 0 TO 23
  ForLoop_02:inc J
    mov ax,J
    cmp al,31
    jg Next_02
    call _xIndex  ;b=h*j+y;READ n
    mov bx,ax;N,ax
    mov K,bp  ;FOR k = 0 TO z
    ForLoop_03:inc K
      mov ax,K
      cmp ax,Z
      jg Next_03
      mov L,bp  ;FOR l = 0 TO h
      ForLoop_04:inc L
        mov ax,L
        cmp ax,H
        jg Next_04
        mov dx,A ;dx=e=a+k
        add dx,K
        mov cx,B ;cx=f=b+l
        add cx,L

        mov al,bl;N ;3/1;=fore/back;P/preSET e f n
        cmp bl,1;N,1;0  ;IF n > 0 THEN
         db 7Fh  ;jg _EndIf_01A;B
        finsdel db 02;07;;ins;del ;fore
         db 0EBh ;jmp $+2;_EndIf_01B;
        insdel  db 00;05
        _EndIf_01A:  ;ENDIF
        call cs:[Pset]
        _EndIf_01B:jmp ForLoop_04  ;NEXT l
      Next_04:  jmp ForLoop_03  ;NEXT k
    Next_03: jmp ForLoop_02  ;NEXT j
  Next_02:jmp ForLoop_01  ;NEXT i
Next_01:

getkey:
  push cs
  pop es
  xor ah,ah
  int 16h
  mov al,ah
  cld
  mov di,offset scodetab
  mov cx,lscode+1
  repne scasb
  je dispatch
beep:
  mov dx,1900h
  xor bh,bh
  mov ah,2
  int 10h
  mov dx,offset lma
  mov ah,9
  int 21h
  jmp short getkey
dispatch:
  sub di,(offset scodetab)+1
  shl di,1
  call ofstab[di]
  jmp again

lma db ' Zoom24.com (C)2008.3 by 苏州(本是)罗明安 born2be@126.com  [Esc]=exit $'
scodetab db 1,'JNHPKMSR57GOIQL',1Ch
lscode equ $-scodetab
ofstab label word
 dw offset _esc
 dw offset _j
 dw offset _n
 dw offset _h
 dw offset _p
 dw offset _k
 dw offset _m
 dw offset _s
 dw offset _r
 dw offset _5
 dw offset _7
 dw offset _g
 dw offset _o
 dw offset _i
 dw offset _q
 dw offset _l
 dw offset _1c
;
 dw offset _nocmd
;;
_esc:  mov ax,3
  int 10h
  mov ah,4Ch
  int 21h

_j:  mov ax,offset PSet1
_jn: mov PSet,ax
_nocmd:  ret

_n:  mov ax,offset PSet2
  jmp short _jn

_s:  mov al,05;del back
insdelj:  mov insdel,al
  ret

_r:  mov al,00;ins back
  jmp short insdelj

_5:  mov al,07;del fore
finsdelj:  mov finsdel,al
  ret

_7:  mov al,02;ins fore
  jmp short finsdelj

_g:;  dec h
  dec z
_k:  dec h
  ret

_o:  dec h
_p:  inc z
  ret

_i:  inc h
_h:  dec z
  ret

_q:;  inc h
  inc z
_m:  inc h
  ret

_l:  mov ax,1
z_h:  mov Z,ax
  mov H,ax
  ret

_1c:  mov ax,20
  jmp short z_h


Pset1 Proc Near
  mov ah,0Ch
  xor bh,bh
  int 10h
  ret
Pset1 Endp

Pset2 Proc Near
  push ds
  push si
  shl dx,4
  mov si,dx
  shl dx,2
  add si,dx
  mov dx,cx
  shr dx,3
  add si,dx
  push 0A000h
  pop ds
  and cl,07h ;bit
  mov dx,3CEh
  mov ah,al ;color
  mov al,0
  out dx,ax
  mov al,8  ;bit mask
  mov ah,80h
  shr ah,cl
  out dx,ax
  mov ax,0F01h ;reset
  out dx,ax
  mov al,[si]
  mov [si],al;bl;al
  pop si;\;mov ax,0001
  pop ds  ;out dx,ax
  ret     ;mov ax,0FF08h
Pset2 Endp;out dx,ax
     


_xIndex Proc Near
  mov ax,H
  mov bx,J
  imul bl
  add ax,Y;;tho DEL-able for y=0
  mov B,ax ;b=h*j+y

  mov si,offset $UserData
  mov bx,$DataCtr
  mov ax,[si+bx]
  add $DataCtr,2
  ret
_xIndex Endp


X dw 0
Y dw 0
Z dw 3
H dw 3
I dw 0
J dw 0
K dw 0
L dw 0
A dw 0
B dw 0
;N dw 0

PSet dw offset PSet1

s1 label word
db 00000000B,00000000B,00000000B,00000000B ;32x24
db 00000000B,00000000B,00000000B,00000000B
db 00000000B,00000011B,10000000B,00000000B
db 00000000B,00000011B,11000000B,00000000B
db 00001111B,11111111B,11111111B,11100000B
db 00001111B,11111111B,11111111B,11100000B
db 00001111B,10000000B,00000001B,11100000B
db 00001110B,00000111B,11111001B,11100000B
db 00001110B,01111111B,11111100B,11100000B
db 00001110B,01111110B,01111100B,11100000B
db 00000000B,00001111B,11110000B,00000000B
db 00000000B,00000111B,10000000B,00000000B
db 00000001B,11111111B,11111111B,11111110B
db 01111111B,11111111B,11111111B,11111110B
db 01111111B,11111101B,11111111B,11111110B
db 01100000B,00000001B,11100000B,01111100B
db 00000000B,00000001B,11100000B,00000000B
db 00000000B,00000011B,11100000B,00000000B
db 00000011B,00001111B,11000000B,00000000B
db 00000001B,11111111B,10000000B,00000000B
db 00000000B,01111111B,00000000B,00000000B
db 00000000B,00000000B,00000000B,00000000B
db 00000000B,00000000B,00000000B,00000000B
db 00000000B,00000000B,00000000B,00000000B

$DataCtr  DW 2
$UserData DW 0
;
s2 label word;dw 24*24 dup(?)
code ends
  end Start
szborn2be
[第12楼]   [ 回复时间:2008-05-22 21:50 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-05-22 20:46
修正:上帖中显示帮助行的时机是按其它键。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved