汇编循环程序

汇编循环程序,第1张

ASSUME  CS:CODE, DS:DATA

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

为数据区中数据的正数、负数和零的个数


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7858076.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-10
下一篇2023-04-10

发表评论

登录后才能评论

评论列表(0条)

    保存