课后实验10
assume cs:c,ds:d,es:tt 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
dd 140417,197514,345980,590827,803530,1183000,1843000
dd 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
t ends
d segment
db 32 dup(0)
d ends
c segment
start:
mov ax,d
mov ds,ax
mov ax,t
mov es,ax
mov bx,0
mov si,0
mov di,0
mov cx,21
mov dh,2
mov dl,30
g:
push cx
push dx
mov ax,es:
mov ,ax
mov ax,es:
mov ,ax
add si,6
mov ax,es:
mov dx,es:
call dtoc2
add si,10
mov ax,es:
mov dx,0
call dtoc2
add si,6
; mov ax,es:
; mov dx,es:
; mov cx,es:
; call divdw
; call dtoc2
mov si,0
b:
mov cx,29
c1:
push cx
mov cl,
jcxz f
d1:
inc si
pop cx
loop c1
inc si
mov al,0
mov ,al
pop dx
mov cl,2
call show
add bx,4
add di,2
add dh,1
pop cx
loop g
mov ax,4c00h
int 21h
f:
mov al,20h
mov ,al
jmp d1
dtoc2:
push ax
push bx
push cx
push dx
push si
push di
mov di,0
d20:
mov cx,10
call divdw
add cx,30h
push cx
inc di
mov cx,ax
jcxz d21
jmp d20
d21:
mov cx,dx
jcxz d22
jmp d20
d22:
mov cx,di
d23:
pop ax
mov ,al
inc si
loop d23
mov al,0
mov ,al
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
divdw:
push si
push bx
push ax
mov ax,dx
mov dx,0
div cx
mov si,ax
pop ax
div cx
mov cx,dx
mov dx,si
pop bx
pop si
ret
show:
push ax
push bx
push es
push si
mov ax,0b800h
mov es,ax
mov ax,160
mul dh
mov bx,ax
mov ax,2
mul dl
add bx,ax
mov al,cl
mov cl,0
show0:
mov ch,
jcxz show1
mov es:,ch
mov es:,al
inc si
add bx,2
jmp show0
show1:
pop si
pop es
pop bx
pop ax
ret
c ends
end start
为什么无法在显存中显示 从程序代码来看,你的问题可能出在以下几个方面:
1. **显存地址设置**:`mov ax,0b800h` 这行代码正确地将显存段地址设置为文本模式,但可能没正确配合其他部分使用。
2. **数据传递**:查看各段间数据传递是否正确,特别是看 `si`, `di`, `bx` 等寄存器的使用是否正确。
3. **索引偏移**:`show`过程内处理数据时,确保`si`和`bx`的偏移计算正确,避免越界或者写入错误位置。
4. **循环与跳转**:检查各个跳转指令和循环条件是否设置正确,避免提前退出或者未进入循环。
5. **中断调用**:`int 21h` 调用结束程序之前,请确认没有其他必要操作遗漏。
建议检查以上几个方面,确保每个步骤和寄存器都符合预期行为。如果有更多具体的错误信息或行为,可以从这些信息逐步排查。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-10-28 11:41
从程序代码来看,你的问题可能出在以下几个方面:
1. **显存地址设置**:`mov ax,0b800h` 这行代码正确 ...
我检查了很多遍,还是没有找到错误{:5_100:} lgmwlj 发表于 2024-10-28 11:52
我检查了很多遍,还是没有找到错误{:5_100:}
要找问题所在,可以尝试以下方法:
1. **逐步调试**:使用调试工具,比如Turbo Debugger,逐步执行程序,观察寄存器和内存变化,找出具体在哪一步出现问题。
2. **简化程序**:将代码简化,去除无关部分,只保留最小工作单元。确保基本功能正常后,逐步增加其他功能,确定哪一部分引入了错误。
3. **注释排查法**:暂时注释掉部分代码,逐步恢复,看哪一段代码引入问题。
4. **显存部分测试**:独立测试显存写入代码,确保字符串能正确显示。可以先用简单数据直接赋值测试。
如果仍然无法找到错误,请确保证代码能够正常读取和显示简单数据,以排除复杂逻辑带来的干扰。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 本帖最后由 jackz007 于 2024-10-29 13:50 编辑
楼主不妨试试这个代码:
assume cs:code,ds:data,es:table
data segment para public 'DATA'
db 400h dup(0)
data ends
table segment para public 'TABLE'
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
dd 140417,197514,345980,590827,803530,1183000,1843000
dd 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
table ends
stack segment stack
db 400h dup(0)
stack ends
code segment para public 'CODE'
; divdw 函数
; 入口参数:dx:ax 被除数
; cx 除数
; 出口参数:dx:ax 商
; cx 余数
divdw proc near
push bx
mov bx,ax
mov ax,dx
xor dx,dx
div cx
push ax
mov ax,bx
div cx
mov cx,dx
pop dx
pop bx
ret
divdw endp
; dtoc 函数
; 入口参数: dx:ax : 目标数
; ds:si : 字符串储存地址
; 出口参数: 无
dtoc proc near
push ax
push cx
push dx
push si
push di
push si
pop di
dtoc01: mov cx,10
call divdw
add cl,'0'
mov byte ptr,cl
inc di
or dx,dx
jnz dtoc01
or ax,ax
jnz dtoc01
xor cl,cl
mov byte ptr,cl
dec di
dtoc02: mov al,
xchg ,al
mov ,al
inc si
dec di
cmp di,si
ja dtoc02
pop di
pop si
pop dx
pop cx
pop ax
ret
dtoc endp
; show_str 函数
; 入口参数 dh : 行号
; dl : 列号
; cl : 颜色
; ds:si : 字符串首地址,以字符 0 结束
; 出口参数 无
show_str proc near
push ax
push dx
push si
push di
push es
mov ax,0b800h
mov es,ax
mov al,160
mul dh
mov di,ax
mov al,dl
shl al,1
cbw
add di,ax
cld
show0:lodsb
or al,al
jz show1
stosb
mov al,cl
stosb
jmp show0
show1:pop es
pop di
pop si
pop dx
pop ax
ret
show_str endp
; cls 函数
; 入口参数: 无
; 出口参数: 无
cls proc near
push ax
push bx
push cx
push dx
mov ax,0600h
mov bl,07h
xor cx,cx ; 左上角
mov dx,184fh ; 右下角
int 10h
pop dx
pop cx
pop bx
pop ax
ret
cls endp
pause proc near
push ax
xor ax,ax
int 16h
pop ax
ret
pause endp
work proc near
push ax
push bx
push cx
push dx
push si
push di
push ds
push es
mov ax,data
mov ds,ax
mov ax,table
mov es,ax
xor di,di
mov bp,0208h
mov bx,8*21
mov cx,21
cld
work01: push cx
xor si,si
mov ax,es:
mov dx,es:
mov ,ax
mov ,dx
xor al,al
mov ,al
mov ax,es:
mov dx,es:
push ax
push dx
add si,10h
call dtoc
xor dx,dx
mov ax,es:
add si,10h
call dtoc
mov cx,ax
pop dx
pop ax
call divdw
add si,10h
call dtoc
xor si,si
mov dx,bp
mov cl,07
call show_str
add si,10h
add dx,16
call show_str
add si,10h
add dx,16
call show_str
add si,10h
add dx,16
call show_str
add bp,100h
add di,4
add bx,2
pop cx
loop work01
pop es
pop ds
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
work endp
main proc far
call cls
call work
call pause
call cls
mov ax,4c00h
int 21h
main endp
code ends
end main
页:
[1]