贝贝·c++吧 关注:3贴子:33
  • 2回复贴,共1

汇编

收藏回复

  • 202.101.222.*
;////////////////////////////////////////////////////////////////////
;// 汇编语言-字 符 矩 阵                                           //
;// CopyRight CCSoft 2005.10.3        --贝贝--QQ:1125591           //
;//                                                                //
;// 运行后输入一个大写字符,然后看输出结果吧!                     //
;// 注意:一定是大写字符,否则后果难料。程序中注释详尽,可以参照   //
;// 改动一下,使之可以适应各种输入。                               //
;//                                                                //
;////////////////////////////////////////////////////////////////////

;///////////////////////macro define segment/////////////////////////
;output pstr
     MOUTPUT  MACRO     PSTR
              MOV       DX,OFFSET PSTR
              MOV       AH,09H
              INT       021H
              ENDM
;if pa(pr)pb,goto pl
       MLOOP  MACRO     PB,PA,PR,PL
              MOV       AL,PA
              CMP       AL,PB
              J&PR      PL
              ENDM
;///////////////////////stack segment////////////////////////////////
      STACKS  SEGMENT   STACK
              DB        128 DUP(?)
      STACKS  ENDS
;///////////////////////data segment/////////////////////////////////
       DATAS  SEGMENT
           N  DB        0           ;这里用来注释循环的次数
       CLINE  DB        13,10,'$'   ;改变串
          OC  DB        ?,'$'       ;输出字符
          LD  DB        ?           ;记录L1的循环次数
          L1  DB        ?           ;LAY的第一次循环记录
         L2A  DB        ?           ;LAY的第二次循环记录
        L2AD  DB        0           ;记录L2AD的循环次数
      BEIBEI  DB        'Wrote in 2005 by BEIBEI',13,10,'$'
        WANG  DB        ' QQ:1125591 ','$'
          QI  DB        ' CopyQight','$'
        CHAO  DB        ' Love HeSiYing Forever~~'    ,13,10,'$'
         L2B  DB        ?
         L2C  DB        ?
         DS1  DB        9,?,?,'$'
       DATAS  ENDS
;///////////////////////code segment/////////////////////////////////
       CODES  SEGMENT
              ASSUME    CS:CODES,DS:DATAS
;///////////////////////////////////
       START  PROC      FAR
;初使化程序
              MOV       AX,DATAS
              MOV       DS,AX
;从输入中读取一个字符以便输出
              MOUTPUT   BEIBEI      ;输出BEIBEI变量中的字符(不知道为什么这段任务完成不了)
              MOUTPUT   WANG
              MOUTPUT   QI
              MOUTPUT   CHAO
              MOV       AH,01H      ;读取字符
              INT       021H
              SBB       AL,41H      ;读取字符的数目
              MOV       N,AL
              MOV       CL,2
              IMUL      CL
              INC       AL
              MOV       L1,AL       ;l1=n*2+1
              MOV       LD,0        ;不循环
              MOV       AL,N
              ADC       AL,41H
              MOV       OC,AL       ;set c n
              CALL      PINISET
;开始绘画  

              MOUTPUT   CLINE       ;改变输入输出的行
        LU1:  MLOOP     L1,1,A,EL1  ;if l1<1 then goto el1(exit loop 1)



1楼2005-10-03 13:47回复
    • 202.101.222.*
                  CALL      PL2A
                  CALL      PL2B
                  CALL      PL2C
    ;设置 2a,2b,2c 的循环
                  CALL      PMARK       ;设置行标
                  MOUTPUT   CLINE       ;如果一行的输出到了顶,则换行
                  INC       LD          ;循环一次
                  DEC       L1
                  CALL      PINISET
            LD1:  JMP       LU1
            EL1:  NOP
                  MOV       AX,4C00H    ;返回值
                  INT       21H
           START  ENDP
    ;///////////////////////////////////
    ;初使化 l2a,l2b,l2c
         PINISET  PROC      NEAR
                  MOV       AL,N
                  CMP       AL,LD
                  JB        NB1         ;if ld>n then goto nb1
                  JE        NE1         ;if ld=n then goto ne1
                  JA        NA1         ;if ld<n then goto na1
            NB1:  MOV       AL,LD
                  SBB       AL,N
                  INC       AL
                  MOV       CL,2
                  MUL       CL
                  INC       AL
                  MOV       L2B,AL      ;l2b=(ld-n+1)*2+1
                  MOV       AL,N
                  MOV       CL,2
                  MUL       CL
                  SBB       AL,LD
                  MOV       L2A,AL      ;l2a=2*n-ld-1
                  MOV       L2C,AL      ;l2a=2*n-ld-1
                  JMP       PE
            NE1:  MOV       AL,N
                  MOV       L2A,AL
                  MOV       L2C,AL
                  MOV       L2B,1
                  JMP       PE
            NA1:  MOV       AL,N
                  MOV       CL,2
                  IMUL      CL
                  INC       AL
                  SBB       AL,LD
                  SBB       AL,LD
                  MOV       L2B,AL      ;l2b=2*n+1-ld-ld
                  MOV       AL,LD
                  MOV       L2A,AL      ;l2a=ld
                  MOV       L2C,AL      ;l2a=ld
                  JMP       PE
             PE:  NOP
                  RET
         PINISET  ENDP
    ;///////////////////////////////////
    ;输出第一部分
            PL2A  PROC      NEAR
           LU2A:  MLOOP     L2A,1,A,EL2A            ;if l2a<1 then goto el2a(exit loop 2a)
                  MOUTPUT   OC          ;输出OC
                  DEC       OC          ;oc=oc-1
                  DEC       L2A         ;l2a=l2a-1
                  JMP       LU2A
           EL2A:  NOP
                  RET
            PL2A  ENDP
    ;///////////////////////////////////
    ;输出第二部分
            PL2B  PROC      NEAR
           LU2B:  MLOOP     L2B,1,A,EL2B            ;if l2b<1 then goto el2b(exit loop 2b)
                  MOUTPUT   OC          ;输出OC
                  DEC       L2B
                  JMP       LU2B
           EL2B:  NOP
                  RET
            PL2B  ENDP
    ;///////////////////////////////////
    ;输出第三部分
            PL2C  PROC      NEAR
           LU2C:  MLOOP     L2C,1,A,EL2C            ;if l2c<1 then goto el2b(exit loop 2c)
                  INC       OC          ;oc=oc+1
                  MOUTPUT   OC          ;输出 oc
                  DEC       L2C
                  JMP       LU2C
           EL2C:  NOP
                  RET
            PL2C  ENDP
    ;///////////////////////////////////
    ;标志行号
           PMARK  PROC      NEAR
                  PUSH      AX
                  PUSH      DX

                  MOV       AH,0
                  MOV       AL,LD
                  INC       AL
                  MOV       DL,10

                  DIV       DL
                  ADC       AH,30H
                  MOV       DS1+2,AH
                  MOV       AH,0

                  DIV       DL
                  ADC       AH,30H
                  MOV       DS1+1,AH
                  MOV       AH,0

                  MOV       DX,OFFSET DS1
                  MOV       AH,9
                  INT       21H
                  POP       DX
                  POP       AX
                  RET
           PMARK  ENDP
           CODES  ENDS
                  END       START
    


    2楼2005-10-03 13:47
    回复
      2025-05-21 18:33:26
      广告
      • 202.101.222.*
      ;最简单的汇编语言程序
       STACKS SEGMENT STACK ;堆栈段
       DW 128 DUP(?)
       STACKS ENDS
       DATAS SEGMENT ;数据段
       STRING DB 'hello,world!',13,10,'$'
       DATAS ENDS
       CODES SEGMENT ;代码段
       ASSUME CS:CODES,DS:DATAS
       START: MOV AX,DATAS ;初始化
       MOV DS,AX
       MOV DX,OFFSET STRING ;显示输出字符串
       MOV AH,9
       INT 21H
       MOV AX,4C00H
       INT 21H ;自动
       CODES ENDS
       END START


      3楼2005-10-03 13:48
      回复