
DATA SEGMENT
in_string db 30, ? 加上这行
STRING DB 30 DUP('#') 填满结束符
NUM DB 30 DUP(?)
BCHAR DB 30 DUP(?)
LCHAR DB 30 DUP(?)
OTHER DB 30 DUP(?)
DATA ENDS
CODE SEGMENT
START:
MOV AX, DATA
MOV DS, AX
lea dx, in_string 加上这三行
mov ah, 10
int 21h
MOV BX, 0
MOV CX, 0
MOV DX, 0
MOV BP, 0
LEA SI, STRING
NEXT:
MOV AL, [SI]
CMP AL, '#'
JE EXIT
CMP AL, '0'
JB OTHERLETTER
CMP AL, '9'
JA NOTNUM
MOV DI, BX
MOV NUM[DI], AL
INC BX
JMP ONCEDONE
NOTNUM:
CMP AL, 'A'
JB OTHERLETTER
CMP AL, 'Z'
JA NOTBLETTER
MOV DI, CX
MOV BCHAR[DI], AL
INC CX
JMP ONCEDONE
NOTBLETTER:
CMP AL, 'a'
JB OTHERLETTER
CMP AL, 'z'
JA OTHERLETTER
MOV DI, DX
MOV LCHAR[DI], AL
INC DX
JMP ONCEDONE
OTHERLETTER:
MOV DI, BP
MOV OTHER[DI], AL
INC BP
ONCEDONE:
INC SI
JMP NEXT
EXIT:
MOV AH, 4CH
INT 21H
CODE ENDS
END START
大写的,是原来的程序。
小写的,是为你增加的。
加上后,即有了输入字符串功能。
一个标准的循环程序应由以下四部分组成:循环准备、循环体、循环修改、循环控制。
循环准备是为循环做准备的,有循环次数和起始地址;循环体是循环程序解题所需的核心程序,题目要完成的功能在此进行;循环修改用来更新某些数据或修正循环控制的参数;循环控制是循环是否结束的控制。
如果在一个程序中的多个地方、或多个程序中的多个地方要用同一段程序,那么可以将这段程序单独设计,存放在某一存储区域,每当需要执行这段程序时,就调用指令转到这段程序去,执行完毕,再返回原来的程序。这段独立出来的程序叫做子程序或过程,调用它的程序称为主程序。采用子程序。使得设计结构清楚,程序的维护方便。当主程序需要执行这个子程序功能时,通过调用该子程序,执行子程序,子程序完成后返回主程序调用处,继续主程序后面的指令的执行。与子程序有关的指令有子程序的调用CALL、子程序返回RET两条指令。
本程序经过masm5.0调试,运行通过Data segment
Buf db 26,47,0,-69,-89,35,0,-46,57,-68,-51,-81,98,-43,0,56,-67,123,-98,0,102,-87,24,67,?,?,?
String db'Press any key to continue...',0ah,0dh,'$'
-------------------------------------
Data ends
Code Segment
Assume CS:Code,DS:Data
Start: mov ax,Data
push ax
pop ds数据段地址给ds
mov si,offset Buf 取数组变量的偏移地址给si
mov al,[si] 数组元素个数送给al
inc si使指针si指向下一个元素
sub al,3 除去用于存放统计个数的三个字节单元
xor ah,ah 高位清零
xor dl,dl dl计算0的个数
xor bx,bx BH用来存正数的个数,BL用来存负数个数
mov cx,ax 元素个数
next:mov al,[si] 读入一个字节数据送给al
Test al,al 试与(and),不返回结果,只根据结果置标志位,al是否为0
jnz a001 不是0,跳到a001判断是否为负数
inc dl 为0,dl加1
jmp EXit_loop无条件跳转到EXit_loop,结束本次循环
a001: js a002判断是否为负数
inc bh 不是负数,bh计数器加1
jmp EXit_loop无条件跳转到EXit_loop,结束本次循环
a002: inc bl 负数计数
EXit_loop:inc si偏移地址加1
loop next
mov [si],bh 正数的个数存入[si]
mov [si+1],bl 负数的个数存入[si+1]
mov [si+2],dl 零的个数存入[si+2]
lea dx,String 输出执行完成,按任意键继续
mov ah,9
int 21h
mov ah,1暂停
int 21h
mov ah,4ch 返回DOS,结束程序
int 21h
Code ENDS 代码段结束
END Start
退出loop循环后
寄存器变化如下:
AX=0043 BX=090A CX=0000 DX=0004 SP=0000 BP=0000 SI=0018 DI=0000
DS=0BCA ES=0BBA SS=0BCA CS=0BCE IP=0034 NV UP EI PL NZ NA PE NC
0BCE:0034 8D161B00 LEA DX,[001B] DS:001B=7250
数据段中内容
-d ds:00 1a
0BCA:0000 1A 2F 00 BB A7 23 00 D2-39 BC CD AF 62 D5 00 38
0BCA:0010 BD 7B 9E 00 66 A9 18 43-09 0A 04
最后三个字节09 0A 04
为数据区中数据的正数、负数和零的个数
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)