2017-04-30 4 views
-2

Comment trouver le nombre maximal de caractères consécutifs dans un octet lorsque j'ai pris un caractère à l'utilisateur et déterminé le nombre de caractères consécutifs maximum dans l'octet. J'ai essayé ce code mais il ne fonctionne pas, il imprime tous ceux dans le nombre pas les consécutifs.code d'assemblage pour trouver le nombre maximum de caractères consécutifs

.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 
+1

1) Formatez ce désordre. 2) Ne pas spammer les tags! Ce n'est pas lié au langage C. 3) Nous ne sommes pas un service de débogage. – Olaf

+0

Alors, que diriez-vous de les suivre? Le gâchis est toujours un gâchis. Mettez en forme le code comme du code! Pourquoi n'avez-vous pas lu la [tournée]? Vous êtes guidé à travers lors de l'inscription. – Olaf

+0

Fonctionne ici. Quel message d'erreur obtenez-vous? Quel assembleur (TASM ou MASM, quelle version), éditeur de liens et émulateur (WinXP, DosBox, QEmu, VrtualBox ou autre) utilisez-vous? – rkhb

Répondre

0

ses comptes en bloc tous les:

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

SI est le "un" -Counter qui compte les.
DI est le compteur "en boucle" qui compte (en baisse) les décalages.

Si vous voulez stocker le nombre maximum de ceux que vous devez ajouter une variable « max » et deux morceaux de code:

  • Code qui remet à zéro l'un compteur si le bit récupéré est nul.
  • Code qui compare le maximum avec le compteur unique et le remplace éventuellement.

J'espère que les commentaires dans le code suivant rendent peu plus claire:

.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 > 

Notes:

  • Le programme a besoin d'un point d'entrée (étiquette) qui n'a pas besoin de être au début du code. Ce point d'entrée est l'argument de l'instruction END. Ne pas utiliser PUSH et POP lorsque vous ne savez pas exactement ce que vous faites. Utilisez plutôt des variables dans le segment .DATA.
  • Peu importe, si vous utilisez des lettres majuscules (MOV AH,09h) ou des lettres minuscules (mov ah,09), mais gardez la méthode de votre choix.
  • Trouvez un style pour le formatage de votre code, par exemple. avec indentation et de nouvelles lignes, de sorte que vous pouvez toujours le comprendre après quelques jours. Les commentaires servent le même but.
+0

merci beaucoup monsieur pour votre aide et pour vous re notes –