lgmwlj 发表于 2024-10-28 11:34:53

课后实验10

assume cs:c,ds:d,es:t

t 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

为什么无法在显存中显示

FishC 发表于 2024-10-28 11:41:16

从程序代码来看,你的问题可能出在以下几个方面:

1. **显存地址设置**:`mov ax,0b800h` 这行代码正确地将显存段地址设置为文本模式,但可能没正确配合其他部分使用。

2. **数据传递**:查看各段间数据传递是否正确,特别是看 `si`, `di`, `bx` 等寄存器的使用是否正确。

3. **索引偏移**:`show`过程内处理数据时,确保`si`和`bx`的偏移计算正确,避免越界或者写入错误位置。

4. **循环与跳转**:检查各个跳转指令和循环条件是否设置正确,避免提前退出或者未进入循环。

5. **中断调用**:`int 21h` 调用结束程序之前,请确认没有其他必要操作遗漏。

建议检查以上几个方面,确保每个步骤和寄存器都符合预期行为。如果有更多具体的错误信息或行为,可以从这些信息逐步排查。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

lgmwlj 发表于 2024-10-28 11:52:21

FishC 发表于 2024-10-28 11:41
从程序代码来看,你的问题可能出在以下几个方面:

1. **显存地址设置**:`mov ax,0b800h` 这行代码正确 ...

我检查了很多遍,还是没有找到错误{:5_100:}

FishC 发表于 2024-10-28 11:52:27

lgmwlj 发表于 2024-10-28 11:52
我检查了很多遍,还是没有找到错误{:5_100:}

要找问题所在,可以尝试以下方法:

1. **逐步调试**:使用调试工具,比如Turbo Debugger,逐步执行程序,观察寄存器和内存变化,找出具体在哪一步出现问题。

2. **简化程序**:将代码简化,去除无关部分,只保留最小工作单元。确保基本功能正常后,逐步增加其他功能,确定哪一部分引入了错误。

3. **注释排查法**:暂时注释掉部分代码,逐步恢复,看哪一段代码引入问题。

4. **显存部分测试**:独立测试显存写入代码,确保字符串能正确显示。可以先用简单数据直接赋值测试。

如果仍然无法找到错误,请确保证代码能够正常读取和显示简单数据,以排除复杂逻辑带来的干扰。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

jackz007 发表于 2024-10-28 18:17:20

本帖最后由 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]
查看完整版本: 课后实验10