|
发表于 2024-9-25 20:23:57
|
显示全部楼层
你好,鱼油!在你的代码中,CX循环计数器在最后变成0但依旧跳回`s`标号是由于PUSH和POP操作对堆栈的影响。你在`s`标号的开始处使用PUSH CX,将循环计数器CX保存到堆栈中,但你在结束时POP CX时把保存的计数器值恢复,使得CX不为0。从而导致循环继续进行。因此,为了解决这个问题,你需要将PUSH和POP操作与CX赋值区分开来。
修改如下:
- assume cs: codesg
- data segment
- db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
- db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
- db '1993','1994','1995'
- dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
- dd 345980,590827 , 803530,1183000,1843000,2759000,3753000,4649000,5937000
- dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
- dw 11542,14430,15257,17800
- data ends
- table segment
- db 21 dup ('year summ ne ?? ')
- table ends
- stacksg segment
- dw 0
- stacksg ends
- codesg segment
- start:
- mov ax, data
- mov es, ax
- mov ax, table
- mov ds, ax
- mov ax, stacksg
- mov ss, ax
- mov sp, 2
- mov bx, 0
- mov bp, 0
- mov di, 0
- mov cx, 21 ; 21行
- s:
- ; 空格初始化
- mov ax, 20h
- mov ds:[bp+4], ax
- mov ds:[bp+9], ax
- mov ds:[bp+12], ax
- mov ds:[bp+15], ax
-
- mov si, 0
- mov cx, 4
- s1:
- ; 获取年份
- mov al, es:[bx + si]
- mov ds:[bp + si], al
- ; 获取公司总收入
- mov al, es:[bx + 54h + si]
- mov ds:[bp + 5 + si], al
- inc si
- loop s1
-
- ; 获取雇员人数
- mov ax, es:[bx + 0A8h]
- mov ds:[bp + 0Ah], ax
- add di, 2
-
- ; 公司总收入/雇员人数
- mov ax, ds:[bp + 5]
- mov dx, ds:[bp + 7]
- div word ptr ds:[bp + 0Ah]
- mov ds:[bp + 0Dh], ax
- ; 更新位置
- add bx, 4
- add bp, 16
- dec cx
- jnz s
- mov ax, 4C00h
- int 21h
- codesg ends
- end start
复制代码
这样的修改确保循环在CX==1时依旧会执行一次,但在这之后不再跳转到s标号,从而避免多执行一次代码。希望这样可以解决你的问题!如果还有其他疑问,请继续提问。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|