8086 程序集,数组值未正确设置



我编写的代码有问题。我在toggle_process子过程中一直得到一个无限循环,但似乎我已经解决了这个问题。我现在遇到的问题是cups数组中的值应该是0或1,但显示的是53248这样的伪值。这项任务的目的是将一块大理石移到一个杯子里,"用1表示",或者如果已经有大理石的话,将其移除。第一遍是1-500,第二遍是2的倍数,第三遍是3的倍数,依此类推

如果答案显而易见,我深表歉意。我的教授整个学期都没教这门课,所以我每一项作业都很吃力。我感谢你的帮助。

;===================================================================
;       Marbles Program
;   Purpose: This Program program displays the prime numbers 
;   between 1-500.
;                 
;===================================================================
        DOSSEG
        .MODEL SMALL,BASIC
        .486
;===================================================================
        INCLUDE PCMAC.inc
        EXTRN GETDEC$:FAR           ;GET 16-BIT DECIMAL INTEGER
        EXTRN NEWLINE:FAR           ;DISPLAY NEWLINE CHARACTER
    EXTRN PUTDEC$:FAR           ;DISPLAY 16-BIT DECIMAL INTEGER
        EXTRN PUTSTRNG:FAR          ;DISPLAY CHARACTER STRING
    EXTRN PAUSE:FAR             ;PAUSES SCREEN
    EXTRN PUTBIN:FAR
;===================================================================
;
; S T A C K   S E G M E N T   D E F I N I T I O N
;
           .STACK 1000H
;===================================================================
;
; C O N S T A N T   S E G M E N T   D E F I N I T I O N
;
           .CONST
header  DB  'Marble Problem.';15
prog_by DB  'Programmed by';29
comma   DB  ',';2
;===================================================================
;       Data Segment Definition
        .Data
cups        DB  500 dup(?)  ;cup with marble = 1,empty = 0
count1      DW  0
count2      DW  0
temp        DW  0
;===================================================================
; C O D E   S E G M E N T   D E F I N I T I O N
        .CODE Main
        .Startup
        push ds
        pop es
;
    ;call initialize
    call toggle_process
    call print_ 
    call newline
    call newline
    lea di,prog_by
    mov cx,29
    call putstrng
    mov cx,0
    call pause
    .exit
;
toggle_process proc near public
    pushf
    mov count1,0
;
_outer:
    add count1,1
    mov count2,0
_inner:
    add count2,1
    call get_index
    mov al,[cups + bx]
    call set_cups
    mov [cups + bx],al
    cmp count2,500
    jne _inner
;
    cmp count1,500
    jne _outer
    popf
    ret
toggle_process endp
;
get_index proc near public
    mov ax,count1
    mov bx,count2
    mul bx
    mov bx,ax
    dec bx
    ret
get_index endp
;
set_cups proc near public uses ax
    pushf
    .if al == 0
        mov al,1
        mov ah,0
    .else
        mov al,0
        mov ah,0
    .endif
    popf
    ret
set_cups endp
;
print_ proc near public
    pushf
    mov bx,0
    mov count1,0
print:
    add count1,1
    mov bx,count1
    dec bx
    mov al,[cups + bx]
    mov bx,0
    mov bl,-1
    call putdec$
    .if count1 != 500
        lea di,comma
        push cx
        mov cx,1
        call putstrng
        pop cx
    .endif
    cmp count1,500
    jne print
    popf
    ret
print_ endp
end 

像53248这样的伪值源于您正在从内存中读取未声明为cups数组一部分的内容,并且因为在print_过程中,您在调用putdec$之前忽略了将AH归零,这需要一个16位的值。

因为count两个变量的值都在1到500之间,所以在get_index中计算的从零开始的索引可能会大到24999。此索引用于引用小得多的数组
通过编写以下内容解决此问题:

cups        DB  25000 dup(?)  ;cup with marble = 1,empty = 0

你当然可以保留500个杯子,并选择两个柜台的好组合。

cmp count2,50
jne _inner
cmp count1,10
jne _outer

cmp count2,25
jne _inner
cmp count1,20
jne _outer

cmp count2,5
jne _inner
cmp count1,100
jne _outer

...