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

非常感谢你的帮助和先生你重新记录 –