8086汇编,数组值未正确设置

时间:2015-12-05 22:53:42

标签: assembly x86-16

我对我编写的代码有疑问。我一直在toggle_process子过程中得到一个无限循环,但似乎我已经解决了这个问题。我现在的问题是cups数组中的值应该是0或1,但显示虚拟值,如53248。 这项任务的目的是将一块大理石移到一个杯子里,用一个"表示,或者如果那里有一块大理石那么将它移走。第一遍是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 

1 个答案:

答案 0 :(得分:2)

那些虚拟值,如53248 源于你从内存中读取的内容,你没有声明你的 cups 数组的一部分,因为在你的在调用需要16位值的 putdec $ 之前忽略零AH的 print _ 过程。

因为两个 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

...