2017-04-30 153 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

他的塊數所有的人:

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

SI是 「一」 -counter其計數的。
DI是計數(下)換檔的「循環」計數器。

如果想存儲你需要添加一個變量「最大」和兩段代碼的人的最大數目:如果取指令位爲空其重置一個櫃檯

  • 代碼。
  • 將最大值與一個計數器進行比較並最終替換它的代碼。

我希望在下面的代碼中的註釋使它有點更清晰:

.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

非常感謝你的幫助和先生你重新記錄 –