⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 4123.asm

📁 把地址偏移量为100H单元开始的256个单元分别写入00H
💻 ASM
字号:
;4-1,2,3  
;把地址偏移量为100H单元开始的256个单元分别写入00H,01H,...,FFH数据,
;并统计0、正数、负数的个数,把统计结果送入上述数据块之后的3个单元中,
;用DOS功能调用显示数据块各单元内容。

        DATA  SEGMENT
              ORG       100H        ;数据块在段中的偏移地址为100H
        BUF1  DB        256 DUP(?)  ;buf1的256个单元存放数据
       COUNT  EQU       $-BUF1      ;数据块长度为256
        BUF2  DB        3 DUP (?)   ;BUF2的3个单元存放统计结果
        DATA  ENDS

        CODE  SEGMENT
              ASSUME    CS:CODE,DS:DATA
      START:  MOV       AX,DATA
              MOV       DS,AX
              LEA       SI,BUF1     ;si指向buf1的首地址
              MOV       CX,COUNT    ;数据块的长度为256
              XOR       AL,AL       ;al清零
              XOR       BX,BX       ;bx清零
              XOR       DH,DH       ;dh清零
      NEXT1:  MOV       [SI],AL     ;将AL的数据(00H~FFH)存入SI所指向的内存单元中
              MOV       AH,[SI]
              CMP       AH,0
              JZ        ZERO        ;若ZF=1,则该数为0,转至zero,DH加1
              JS        NEGATIVE    ;若SF=1,则该数为负数,则转至NEGATIVE,BH加1
              INC       BL          ;若SF=0,则该数为正数,则BL加1,即正数的个数加1
              JMP       NEXT2
       ZERO:  INC       DH          ;0的个数加1
              JMP       NEXT2
   NEGATIVE:  INC       BH          ;负数的个数加1
              JMP       NEXT2
      NEXT2:  INC       AL          ;al加1
              INC       SI          ;si指向下一单元
              LOOP      NEXT1
              MOV       [SI],DH     ;在数据块后存入0的总个数
              INC       SI
              MOV       [SI],BL     ;在0的总个数后存入正数的总个数
              INC       SI
              MOV       [SI],BH     ;在正数的总个数后存入负数的总个数
              LEA       SI,BUF1
              MOV       CX,COUNT+3  ;数据块的长度是259
       LINE:  MOV       BH,16       ;每输出16个数回车换行
      NEXT3:  MOV       AL,[SI]
              MOV       BL,AL
              SHR       AL,1        ;将al中存的值逻辑左移4,则al中的值是bl的高四位
              SHR       AL,1
              SHR       AL,1
              SHR       AL,1
              CALL      EXCHANGE    ;将al中的值转换为ASCII码
              MOV       AL,BL
              AND       AL,0FH      ;al中的值是bl的低四位
              CALL      EXCHANGE    ;将其转换为ASCII码
              MOV       AL,20H      ;输出空格
              CALL      SHOW
              INC       SI          ;si指向下一单元
              LOOP      NEXT4
              JMP       STOP
      NEXT4:  DEC       BH          ;bh减1
              JNZ       NEXT3
              MOV       AL,0DH      ;回车
              CALL      SHOW
              MOV       AL,0AH      ;换行
              CALL      SHOW
              JMP       LINE

    EXCHANGE  PROC      NEAR        ;将al中的值转换为ASCII码
              CMP       AL,0AH
              JS        DONE
              ADD       AL,7
       DONE:  ADD       AL,30H
              MOV       DL,AL
              MOV       AH,02H
              INT       21H
              RET
    EXCHANGE  ENDP

        SHOW  PROC      NEAR        ;显示
              MOV       DL,AL
              MOV       AH,02H
              INT       21H
              RET
        SHOW  ENDP

       STOP:  MOV       AH,4CH      ;结束
              INT       21H
        CODE  ENDS
              END       START


;子程序清单:

;子程序名:EXCHANGE
;功能:将一个字节的十六进制数的低四位转换成ASCII码并显示
;所用寄存器:al,dl,ah
;入口参数:al存放一个字节(十六进制数的低四位)
;出口参数:无

;子程序名:SHOW
;功能:显示ASCII代码
;所用寄存器:al,dl,ah
;入口参数:al存放一个ASCII代码
;出口参数:无

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -