查找最大连续数的汇编代码

assembly code to find the max number of consecutive ones

当我从用户那里取一个字符并确定字节中最大连续的个数时,如何找到一个字节中最大连续的个数。我试过这段代码,但它不起作用,它打印的是数字中的所有数字而不是连续的数字。

.model small
.stack  100
.data
    message db "Enter one charachter $" 
    NewLine DB 0DH,0AH, "$"
    message db "Enter one charachter $" 
    NewLine DB 0DH,0AH, "$"
    message2 db "The maximum number of consecutive ones is $" 

.code
    mov ax, @data
    mov ds,ax
    push ax
    mov ah,09 
    lea dx,message 
    int 21h 
    pop ax
    MOV AH,09 
    MOV DX,OFFSET NewLine 
    INT 21H 
    mov ah,1
    int 21h
    mov si,0
    mov di,8
    l1:
        shl al,1
        jnc no_inc_count
            inc si
        no_inc_count:
        dec di
    jnz l1
    MOV AH,09h
    MOV DX,OFFSET NewLine 
    INT 21H 
    push ax
    mov ah,09 
    lea dx,message2 
    int 21h 
    pop ax
    MOV AH,09 
    MOV DX,OFFSET NewLine
    INT 21H 
    mov ah,2
    add si,30h
    mov dx,si
    int 21h
    mov ah,4ch 
    int 21h 
end

他的块数全部为:

mov si,0
mov di,8
l1:
shl al,1
jnc no_inc_count
inc si
no_inc_count:
dec di
jnz l1

SI 是 "one"-计数器,它计算那些。
DI 是 "loop"-计数器,它计算(向下)班次。

如果要存储最大个数需要添加一个变量"max"和两段代码:

  • 如果获取的位为空,则重置单计数器的代码。
  • 将最大值与一个计数器进行比较并最终替换它的代码。

我希望下面代码中的注释能让它更清楚一点:

.MODEL small
.STACK                          ;  Default 1024

.DATA
message     db "Enter one character $"
message2    db "The maximum number of consecutive ones is $"
NewLine     db 0DH,0AH, "$"
max         dw 0            ; Holds the maximum number of consecutive ones

.CODE
start:                      ; Entry point needed for END
    mov ax, @data           ; Let DS point to .DATA
    mov ds,ax

    mov ah,09h              ; http://www.ctyme.com/intr/rb-2562.htm
    lea dx,message
    int 21h                 ; Call MS-DOS

    mov ah, 01h             ; http://www.ctyme.com/intr/rb-2552.htm
    int 21h                 ; Call MS-DOS

    mov si, 0               ; One-counter
    mov di, 8               ; Loop-counter: Shift 8 bits

    FOR:                    ; Loop 8 times
    shl al, 1               ; shift one bit into carry flag (CF)
    jnc IS_NULL             ; jump if no "one"

    IS_ONE:                 ; Code to increment one-counter and replace max
    inc si                  ; one-counter++
    cmp si, max             ; si > max ?
    jbe LOWER               ; No - comparation has set CF or ZF
        GREATER:            ; Yes, si > max (comparation has cleared CF and ZF)
        mov max, si         ; Replace max by SI
        LOWER:
    jmp CONTFOR             ; Decrement loop-counter and loop

    IS_NULL:
        mov si, 0           ; Reset one-counter

    CONTFOR:                ; Decrement loop-counter and continue looping
    dec di
    jnz FOR

    mov ah, 09h             ; http://www.ctyme.com/intr/rb-2562.htm
    lea dx, NewLine
    int 21h                 ; Call MS-DOS

    mov ah, 09h             ; http://www.ctyme.com/intr/rb-2562.htm
    lea dx, message2
    int 21h                 ; Call MS-DOS

    add max, 30h            ; To ASCII
    mov ah, 2               ; http://www.ctyme.com/intr/rb-2554.htm
    mov dx, max
    int 21h                 ; Call MS-DOS

    mov ah, 09h             ; http://www.ctyme.com/intr/rb-2562.htm
    lea dx, NewLine
    int 21h                 ; Call MS-DOS

    mov ax,4C00h            ; AH=4Ch (exit), exitcode AL=0 (ok)
    int 21h                 ; Call MS-DOS

END start                   ; END < entry point >

备注:

  • 程序需要一个入口点(标签),它不需要位于代码的开头。该入口点是 END 语句的参数。
  • 当您不清楚自己在做什么时,请不要使用 PUSHPOP。请改用 .DATA 段中的变量。
  • 使用大写字母(MOV AH,09h)或小写字母(mov ah,09)都没有关系,但您应该按照自己选择的方式使用。
  • 寻找格式化代码的样式,例如有缩进和换行,这样你几天后仍然可以理解它。评论服务于相同的目的。