鱼C论坛

 找回密码
 立即注册
查看: 152|回复: 4

[汇编作业] 课后实验10

[复制链接]
发表于 2024-10-28 11:34:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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:[bx]
  mov [si],ax
  mov ax,es:[bx+2]
  mov [si+2],ax
  add si,6
  mov ax,es:[bx+84]
  mov dx,es:[bx+86]
  call dtoc2
  add si,10
  mov ax,es:[di+168]
  mov dx,0
  call dtoc2
  add si,6
; mov ax,es:[bx+84]
; mov dx,es:[bx+86]
; mov cx,es:[di+168]
; call divdw
; call dtoc2
  mov si,0
b:
  mov cx,29
c1:
  push cx
  mov cl,[si]
  jcxz f
d1:
  inc si
  pop cx
  loop c1
  inc si
  mov al,0
  mov [si],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 [si],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 [si],al
  inc si
  loop d23
  mov al,0
  mov [si],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,[si]
  jcxz show1
  mov es:[bx],ch
  mov es:[bx+1],al
  inc si
  add bx,2
  jmp show0
show1:
  pop si
  pop es
  pop bx
  pop ax
  ret
c ends
end start

为什么无法在显存中显示
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-10-28 11:41:16 | 显示全部楼层
从程序代码来看,你的问题可能出在以下几个方面:

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

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

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

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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-28 11:52:21 | 显示全部楼层
FishC 发表于 2024-10-28 11:41
从程序代码来看,你的问题可能出在以下几个方面:

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

我检查了很多遍,还是没有找到错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-28 11:52:27 | 显示全部楼层
lgmwlj 发表于 2024-10-28 11:52
我检查了很多遍,还是没有找到错误


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

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

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

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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[di],cl
        inc di
        or dx,dx
        jnz dtoc01
        or ax,ax
        jnz dtoc01
        xor cl,cl
        mov byte ptr[di],cl
        dec di
dtoc02: mov al,[si]
        xchg [di],al
        mov [si],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:[di]
        mov dx,es:[di+2]
        mov [si],ax
        mov [si+2],dx
        xor al,al
        mov [si+4],al
        mov ax,es:[di+4*21]
        mov dx,es:[di+4*21+2]
        push ax
        push dx
        add si,10h
        call dtoc
        xor dx,dx
        mov ax,es:[bx]
        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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 17:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表