+ -
当前位置:首页 → 问答吧 → 分析一下这段汇编代码,我还没看懂呀!

分析一下这段汇编代码,我还没看懂呀!

时间:2011-06-08

来源:互联网

Assembly code
NAME   EXAMPLE8_9
DSEG   SEGMENT
ARRAYB DB   (若干个字节)
COUNT  EQU $-ARRAYB
ANS    DW   ?
DSEG   ENDS
;
SSEG   SEGMENT STACK
       DB  80H  DUP(0)
SSEG   ENDS
;
CSEG   SEGMENT
       ASSUME DS:DSEG,SS:SSEG,CS:CSEG
START  MOV  AX,DSEG
       MOV  DS,AX
;
       LEA  SI,ARRAYB
       MOV  CX,COUNT
       PUSH SI
       PUSH CX
       CALL ZNUM
       POP  AX
       MOV  ANS,AX
       MOV  AH,4CH
       INT  21H
       ;
ZNUM   PROC
       MOV  BP,SP
       MOV  CX,[BP+2]
       MOV  SI,[BP+4]
       XOR  AX,AX
NEXT: CMP   BYTE PTR[SI],0
      JNZ   NZ      
      INC   AX
NZ:   INC   SI
      LOOP  NEXT
      MOV   [BP+4],AX
      RET   2
ZNUM  ENDP
CSEG  ENDS
      END   START

作者: kent0122   发布时间: 2011-06-08

不好意思, 蹭点分


这段代码用来计算ARRAYB中的字符串个数

NAME EXAMPLE8_9
DSEG SEGMENT
ARRAYB DB (若干个字节)
COUNT EQU $-ARRAYB ; ARRAYB的大小, 以字节为单位
ANS DW ?
DSEG ENDS
;
SSEG SEGMENT STACK
  DB 80H DUP(0)
SSEG ENDS
;
CSEG SEGMENT
  ASSUME DS:DSEG,SS:SSEG,CS:CSEG
START MOV AX,DSEG
  MOV DS,AX ; DS指向数据段
;
  LEA SI,ARRAYB ; SI指向ARRAYB,SI存放的是ARRAYB的偏移量
  MOV CX,COUNT ; CX为ARRAYB的字节数, 循环控制变量
  PUSH SI ; 将SI进栈, 作为ZNUM的参数
  PUSH CX ; 将CX进栈, 作为ZNUM的参数
  CALL ZNUM ; 调用函数ZNUM, 计算ARRAYB中字符串的个数
  ; 函数ZNUM的返回值(字符串的个数)通过栈返回
  POP AX ; 弹出返回值
  MOV ANS,AX ; 将返回值存放到变量ANS
  MOV AH,4CH
  INT 21H ; 返回DOS
  ;
ZNUM PROC
  MOV BP,SP ; BP指向栈顶
  MOV CX,[BP+2] ; 取第一个参数存放到CX, ARRAYB的字节数
  MOV SI,[BP+4] ; 取第二个参数存放到SI, SI指向ARRAYB数组
  XOR AX,AX ; AX = 0, AX作为字符串计数器
NEXT: CMP BYTE PTR[SI],0 ; 比较DS:SI所指向的字符是否是00(字符串结束符)
  JNZ NZ ; 若不是字符串结束符, 则跳转到NZ
  INC AX ; 否则是字符串结束符, 则是一个字符串, 递增字符串计数器AX
NZ: INC SI ; 递增SI指向下一个字符
  LOOP NEXT ; 递减CX, 若CX非0, 则循环
  MOV [BP+4],AX ; 将AX(字符串计数器)存放到栈中, 作为返回值
  RET 2 ; 返回, 弹出IP和第一个参数, 返回值(字符串计数器)在栈顶
ZNUM ENDP
CSEG ENDS
  END START

作者: yeanwu   发布时间: 2011-06-09