2017-04-30 7 views
-2

사용자로부터 문자를 가져 와서 바이트에서 최대 연속 수의 수를 결정할 때 바이트에서 최대 연속 수를 어떻게 찾을 수 있습니까? 나는이 코드를 시도했지만 작동하지 않는다. 연속 된 것이 아닌 숫자의 모든 것을 인쇄한다.최대 연속 수를 찾는 어셈블리 코드

.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)이 엉망으로 만드십시오. 2) 스팸 태그를 사용하지 마십시오! 이것은 C 언어와 관련이 없습니다. 3) 우리는 디버깅 서비스가 아닙니다. – Olaf

+0

그럼 어때요? 엉망은 여전히 ​​혼란 스럽다. 코드를 코드로 포맷하십시오! 왜 [투어]를 읽지 않았습니까? 등록시 안내를받습니다. – Olaf

+0

여기에서 작동합니다. 어떤 오류 메시지가 나타 납니까? 어셈블러 (TASM 또는 MASM, 버전), 링커 및 에뮬레이터 (WinXP, DosBox, QEmu, VrtualBox 또는 다른 어떤 것)를 사용합니까? – rkhb

답변

0

자신의 블록 수가 모두 1 :

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

SI이 사람을 세는 "하나"계수기입니다.
DI은 교대조를 카운트 (아래로)하는 "루프"카운터입니다. 가져온 비트가 null의 경우 하나의 카운터를 재설정

  • 코드 :

    당신이 변수 "최대"코드의 두 조각을 추가 할 필요가 사람의 최대 수를 저장하려면

    .
  • 최대 값을 1 카운터와 비교하여 결국 교체하는 코드입니다.

는 다음 코드의 주석을 만들 희망 그것은 분명 조금 : 노트

.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) 문자를 사용하는 경우 문제가되지 않지만 원하는 방법을 선택해야합니다.
  • 코드 형식을 지정하기위한 스타일 찾기. 들여 쓰기와 새 줄을 써서 며칠 후에도 이해할 수 있습니다. 댓글은 같은 목적을 위해 사용됩니다.
+0

도움을 주셔서 대단히 감사합니다. 너 노트 –