荣誉值:4
信誉值:2
注册日期:2011-08-30 04:54 |
我最近在自学这本优秀的教材,到课程设计1是怎么也过不去了,解决一个问题就又来一个问题。现在这个问题可能是最后一个,可怎么也搞不明白问题的症结,恳请各位指点迷津。
我的程序使用LOOP, 不知什么原因最后5年不显示,只显示到第1990年。
而如果一年一年的重复21次,就可以显示全部。
我想用DEBUG,可到了show_str也被直接中断了(原因也是不知), 所以到现在也不能解决。 请各位高手指点一下方向。 谢谢了
下面是程序可以显示全部,但使用重复21次的截图(只显示开始三年的编码)
<img src="https://skydrive.live.com/?cid=29515e50dbb28eec#cid=29515E50DBB28EEC&id=29515E50DBB28EEC%21293">
如果图片不能显示,请直接访问https://skydrive.live.com/?cid=29515e50dbb28eec#cid=29515E50DBB28EEC&id=29515E50DBB28EEC%21293
再下面是程序最后5年不显示,使用LOOP
<img src="https://skydrive.live.com/?cid=29515e50dbb28eec#cid=29515E50DBB28EEC&id=29515E50DBB28EEC%21294">
如果图片不能显示,请直接访问https://skydrive.live.com/?cid=29515e50dbb28eec#cid=29515E50DBB28EEC&id=29515E50DBB28EEC%21294
在下面是我的编码,我把21次重复编码注释掉了,现在是使用LOOP。
assume ds:data, es:table, cs:code
data segment
db '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982'
db '1983' ,'1984', '1985', '1986', '1987', '1988', '1989', '1990'
db '1991', '1992', '1993', '1994', '1995' ; 4bytes per year
dd 16, 22, 382, 1356, 2390, 8000, 16000, 24486 ;4 bytes per number
dd 50065, 97479, 140417, 197514, 345980, 590827, 803530, 1183000
dd 1843000, 2759000, 3753000, 4649000, 5937000
dd 3, 7, 9, 13, 28, 38, 130, 220
dd 476, 778, 1001, 1442, 2258, 2793, 4037, 5635
dd 8226, 11542, 14430, 15257, 17800
data ends
table segment
;db 'year summ n1 ?? '
;db 'year summ n2 ?? '
;db 19 dup ('year summ ne ?? ')
db 'Year' ; Year 4 digits [0-3]
dw 0 ; amont L [4-5]
dw 0 ; amont H [6-7]
dw 0 ; people count [8-9]
dw 0 ; averge [10-11]
dw 0 ; filler [12-13]
dw 0 ; filler [14-15]
;[16-17],[18-19],[20-21],[22-23],[24-25],[26-27],[28-29],[30-31]
dw 00,317ah,0000h,000Ah,0008h,0008h,0008h,0008h
;[32],[33],[34],[35],[36],[37],[38],[39],[40],[41],[42],[43],[44],[45],[46],[47]
db 16 dup (0) ;decimal output buffer
;[48 - 55]
db 8 dup (' ') ;year
;[56 - 71]
db 16 dup (' ') ;total amount
;[72 - 87]
db 16 dup (' ') ;Peope count
;[88 - 103]
db 16 dup ('-') ;average count
;[104 - 107]
dw 00,00 ;function movCol parameters, 104 is source position, 106 is output position
;[108]
dw 00 ;data segment pointer value, can be 0, 1
;[110]
db 00 ;Display buffer pointer value
table ends
code segment
start: mov ax, data
mov ds, ax
mov ax, table
mov es, ax
;*********************使用LOOP 开始
mov cx, 21
mov es:[110], 0b800h
mov si, 0
mov ax, 0
shwNYr:
mov bx, es:[110]
add bx, 0Ah
mov es:[110], bx
mov es:[108], ax ; mov 0 to year data pointer
add ax, 4
Call shwYear
loop shwNYr ;
;*********************使用LOOP 结束
;*********************使用21次硬编码 开始
; mov es:[110], 0b800h ;0 ;1975
; mov ax, 0
; mov es:[108], ax ; mov 0 to year data pointer
; Call shwYear
; mov es:[110], 0b80Ah ;1 ;1976
; mov ax, 4
; mov es:[108], ax ; mov 0 to year data pointer
; Call shwYear
; mov es:[110], 0b814h ;2 ;1977
; mov ax, 8
; mov es:[108], ax ; mov 0 to year data pointer
; Call shwYear
; mov es:[110], 0b81Eh ;3 ;1978
; mov ax, 12
; mov es:[108], ax ; mov 0 to year data pointer
; Call shwYear
; mov es:[110], 0b828h ;4 ;1979
; mov ax, 16
; mov es:[108], ax ; mov 0 to year data pointer
; Call shwYear
; mov es:[110], 0b832h ;@60 5 ;1980
; mov ax, 20
; mov es:[108], ax ; mov 0 to year data pointer
; Call shwYear
; mov es:[110], 0b83Ch ;@71 6 ;1981
; mov ax, 24
; mov es:[108], ax ; mov 0 to year data pointer
; Call shwYear
; mov es:[110], 0b846h ;7 ;1982
; mov ax, 28
; mov es:[108], ax ; mov 0 to year data pointer
; Call shwYear
; mov es:[110], 0b850h ;8 ;1983
; mov ax, 32
; mov es:[108], ax ; mov 0 to year data pointer
; Call shwYear
; mov es:[110], 0b85Ah ;9 ;1984
; mov ax, 36
; mov es:[108], ax ; mov 0 to year data pointer
; Call shwYear
; mov es:[110], 0b864h ; 10 ;1985
; mov ax, 40
; mov es:[108], ax ; mov 0 to year data pointer
; Call shwYear
; mov es:[110], 0b86Eh ; 11 ;1986
; mov ax, 44
; mov es:[108], ax ; mov 0 to year data pointer
; Call shwYear
; mov es:[110], 0b878h ; 12 1987
; mov ax, 48
; mov es:[108], ax ; mov 0 to year data pointer
; Call shwYear
; mov es:[110], 0b882h ; 13 1988
; mov ax, 52
; mov es:[108], ax ; mov 0 to year data pointer
; Call shwYear
; mov es:[110], 0b88Ch ; 14 1989
; mov ax, 56
; mov es:[108], ax ; mov 0 to year data pointer
; Call shwYear
; mov es:[110], 0b896h ; 15 1990
; mov ax, 60
; mov es:[108], ax ; mov 0 to year data pointer
; Call shwYear
; mov es:[110], 0b8A0h ; 16 1991
; mov ax, 64
; mov es:[108], ax ; mov 0 to year data pointer
; Call shwYear
; mov es:[110], 0b8AAh ; 17
; mov ax, 68
; mov es:[108], ax ; mov 0 to year data pointer
; Call shwYear
; mov es:[110], 0b8B4h ; 18
; mov ax, 72
; mov es:[108], ax ; mov 0 to year data pointer
; Call shwYear
; mov es:[110], 0b8BEh ; 19
; mov ax, 76
; mov es:[108], ax ; mov 0 to year data pointer
; Call shwYear
; mov es:[110], 0b8C8h ;20
; mov ax, 80
; mov es:[108], ax ; mov 0 to year data pointer
; Call shwYear
; mov es:[110], 0b8D2h ; 21
; mov ax, 84
; mov es:[108], ax ; mov 0 to year data pointer
; Call shwYear
;*********************使用21次硬编码 结束
mov ax, 4c00h
int 21h
;***********************************************************
;****** Show One Year's inform
shwYear:
push ax
push bx
push cx
push dx
;push sp
push bp
push si
push di
mov si, es:[108] ;year off set
;mov ax, es:[si] ;year off set
;put year at line 18 db 'Year' ; Year 4 digits
mov ax, ds:[si] ;ds:[0]
mov es:[0], ax
mov ax, ds:[si+2] ;ds:[2]
mov es:[2], ax
;put amount
;off set 21 year, 21 * 4= 84bytes
mov ax, ds:[si+84] ;ds:[84] ;ds:[84] = 16
mov es:[4], ax
mov ax, ds:[si+86] ;ds:[86] ;ds:
mov es:[6], ax
;put people count
;off set 21 numbers, 21 * 4= 84bytes
mov ax, ds:[si+168] ; ds:[168]
mov es:[8], ax
;Now I got '31 39 37 35 10 00 00 00-03 00 00 00 00 00 00 00'
;push bp
Call divDW ;Compile Line @2D
;pop bp
;D 1966:0 f should be
;'31 39 37 35 10 00 00 00-03 00 00 00 05 00 00 00'
;*********************** Move Year ************************
mov ax, es:[0] ;Line 47 in exe
mov es:[48], ax
mov ax, es:[2]
mov es:[48+2], ax
;D 1966:30 3f should be
;'31 39 37 35 20 20 20 20-20 20 20 20 20 20 20 20'
;*********************** Move Total Amount ************************
mov ax, 4
mov es:[104], ax
mov ax, 56
mov es:[106], ax
;push bp
Call MovCol ;@5E
;pop bp
;D 1966:30 3f should be
;'31 39 37 35 20 20 20 20-31 36 20 20 20 20 20 20'
;push bp
CALL clnBuf
;pop bp
;*********************** Move People Amount ************************
mov ax, 8
mov es:[104], ax
mov ax, 72
mov es:[106], ax
;push bp
Call MovCol ;@81
;pop bp
;D 1966:30 4f
;'31 39 37 35 20 20 20 20-31 36 20 20 20 20 20 20'
;'20 20 20 20 20 20 20 20-33 20 20 20 20 20 20 20'
;push bp
CALL clnBuf
;pop bp
;********************** Move average ***********************
mov ax, 12
mov es:[104], ax
mov ax, 88
mov es:[106], ax
;push bp
Call MovCol ;@81
;pop bp
;D 1966:30 4f
;'31 39 37 35 20 20 20 20-31 36 20 20 20 20 20 20'
;'20 20 20 20 20 20 20 20-33 20 20 20 20 20 20 20'
;push bp
CALL clnBuf
;pop bp
;mov string terminator
mov cx, 0 ;@11B
mov es:[93], cx
;D 1966:30 5f
;'31 39 37 35 20 20 20 20-31 36 20 20 20 20 20 20'
;'20 20 20 20 20 20 20 20-33 20 20 20 20 20 20 20'
;'20 20 20 20 20 20 20 20-35 20 20 20 20 20 20 00'
MOV ax, es:[110] ;0b800h
;push bp
Call Show_str ;@123
;pop bp
pop di
pop si
pop bp
;pop sp
pop dx
pop cx
pop bx
pop ax
ret
;***********************************************************
;****** Move Column
movCol:
;pop bp
push ax
push bx
push cx
push dx
;push sp
push bp
push si
push di
mov si, es:[104]
mov ax, es:[si]
mov es:[18], ax ; 4240 Divident(L)
mov ax, es:[si+2]
mov es:[20], ax ; 000f Divident(H)
mov si, 46
push bp
Call ToAsc ;@11C
pop bp
mov cx, 8
mov bx, 0
mov si, 0
movAsc4:
PUSH cx
mov cx, es:[31+si]
ADD si, 2
jcxz skpEmp4
mov ax, table
mov es, ax
push si
mov si, es:[106]
mov es:[si+bx], ch
pop si
ADD bx, 1
skpEmp4:
pop cx
loop movAsc4 ;
pop di
pop si
pop bp
;pop sp
pop dx
pop cx
pop bx
pop ax
;push bp ;@147
ret
;***********************************************************
;****** Show Text
show_str:
;pop bp ;@F6
push ax
push bx
push cx
push dx
;push sp
push bp
push si
push di
push ss
;mov ax, 0b86eh
mov ax, es:[110]
mov ss, ax ;row
mov si, 08 ;Column, control left or right on screen
mov bx, 0 ;String stard postion
mov ah, 00000010B ;Font
main:
mov cl, es:[bx+48] ; ds:[bx] is the character @109
mov al, ' '
mov es:[bx+48], al ; reset the ascii to empty
mov al, cl
mov ch, 0
jcxz EXIT_SS ;@110
mov ss:[si], ax ; this ss:[si+bx] is character position
inc bx
add si, 2
jmp short main ;@119
EXIT_SS:
pop ss
pop di
pop si
pop bp
;pop sp
pop dx
pop cx
pop bx
pop ax
ret
;*******************divDW************************
;| | | | | | | |
;0 4 6 8 10 12 14
;0 - year
;4 - revenue LOW
;6 - revennue HIGH
;8 - People
;10 - Average
;12 - Not in use
;14 - Not in use
;For example input is
;31 39 37 35 10 00 00 00-03 00 00 00 00 00 00 00'
;then output should be
;31 39 37 35 10 00 00 00-03 00 00 00 05 00 00 00'
; db 'Year' ; Year 4 digits [0-3]
; dw 0 ; amont L [4-5]
; dw 0 ; amont H [6-7]
; dw 0 ; people count [8-9]
; dw 4 ; averge [10-11]
; dw 4 ; filler [12-13]
; dw 4 ; filler [14-15]
divDW: ;chapter: 8.7 Page 157
push ax
push bx
push cx
push dx
;push sp
push bp
push si
push di
MOV BX, es:[4] ;4240 Divident(L) ;Compile Line 5E @FD
MOV AX ,es:[6] ; 000f Divident(H)
MOV CX ,es:[8] ; 000A Divisor
MOV DX, 0
DIV CX ; (DX(0) + AX(000f)) / CX
mov es:[14], ax
MOV AX, BX ; move Divident (L) in AX
DIV CX ; (DX(0005) + AX (4240)) / CX
mov es:[12], ax
;mov es:[0], dx
pop di
pop si
pop bp
;pop sp
pop dx
pop cx
pop bx
pop ax
ret ;@11D
;*******************To Ascii************************
;| | | | | | | |
;0 2 4 6 8 10 12 14
;0 - remainder
;2 - Divident LOW
;4 - Divident HIGH
;6 - TEN
;8 - NOT IN USE
;dw 00,4240h,000fh,000Ah,0008h,0008h,0008h,0008h
;PUT the output to 32-47 position
;
ToAsc: ;chapter: 8.7 Page 157 @1A8
push ax
push bx
push cx
push dx
;push sp
push bp
push si
push di
ToAsc_m:
MOV BX, es:[18] ; 4240 Divident(L)
MOV AX ,es:[20] ; 000f Divident(H)
MOV CX ,es:[22] ; 000A Divisor
MOV DX, 0 ;@12E
DIV CX ; (DX(0) + AX(000f)) / CX
mov es:[20], ax
MOV AX, BX ; move Divident (L) in AX
DIV CX ; (DX(0005) + AX (4240)) / CX
mov es:[18], ax
mov es:[16], dx
mov cx, es:[16] ; set remaider in cx
add cx, 30h ; add decimal ascii
mov es:[si], cx
SUB si, 2
mov ax, es:[18] ; using bit OR to merge Divident H to Divident Low
OR ax, es:[20] ; Divident H is ds:[4], Divident L is ds:[2]
MOV cx, ax ; Then check whether ds:[2] is 0 or not
jcxz EXIT_TA ;exit_toAsicc ;@1E7
jmp ToAsc_m
EXIT_TA:
pop di
pop si
pop bp
;pop sp
pop dx
pop cx
pop bx
pop ax
ret
;***********************************************************
;****** clean buffer
clnbuf:
push ax
push bx
push cx
push dx
;push sp
push bp
push si
push di
mov cx, 8 ;@61
mov bx, 0
reset:
MOV ax, 0
mov es:[32+bx], ax
ADD bx, 2
loop reset
pop di
pop si
pop bp
;pop sp
pop dx
pop cx
pop bx
pop ax
ret
code ends
end start | | |