我对我编写的代码有疑问。我一直在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
答案 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
或
...