分析一下这段汇编代码,我还没看懂呀!
时间: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
这段代码用来计算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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28