鱼C论坛

 找回密码
 立即注册
查看: 561|回复: 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

为什么无法在显存中显示
小甲鱼最新课程 -> https://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 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

我检查了很多遍,还是没有找到错误
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

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

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

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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-28 18:17:20 | 显示全部楼层
本帖最后由 jackz007 于 2024-10-29 13:50 编辑

        楼主不妨试试这个代码:
  1. assume cs:code,ds:data,es:table

  2. data segment para public 'DATA'
  3.         db 400h dup(0)
  4. data ends

  5. table segment para public 'TABLE'
  6.         db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
  7.         db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
  8.         db '1993','1994','1995'
  9.         dd 16,22,382,1356,2390,8000,16000,24486,50065,97479
  10.         dd 140417,197514,345980,590827,803530,1183000,1843000
  11.         dd 2759000,3753000,4649000,5937000
  12.         dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
  13.         dw 11542,14430,15257,17800
  14. table ends

  15. stack segment stack
  16.         db 400h dup(0)
  17. stack ends

  18. code segment para public 'CODE'

  19. ; divdw 函数
  20. ; 入口参数:dx:ax 被除数
  21. ;              cx 除数
  22. ; 出口参数:dx:ax 商
  23. ;              cx 余数         

  24. divdw proc near
  25.         push bx
  26.         mov bx,ax
  27.         mov ax,dx
  28.         xor dx,dx
  29.         div cx
  30.         push ax
  31.         mov ax,bx
  32.         div cx
  33.         mov cx,dx
  34.         pop dx
  35.         pop bx
  36.         ret
  37. divdw endp

  38. ; dtoc 函数
  39. ; 入口参数:   dx:ax : 目标数
  40. ;              ds:si : 字符串储存地址
  41. ; 出口参数:   无
  42. dtoc proc near
  43.         push ax
  44.         push cx
  45.         push dx
  46.         push si
  47.         push di
  48.         push si
  49.         pop di
  50. dtoc01: mov cx,10
  51.         call divdw
  52.         add cl,'0'
  53.         mov byte ptr[di],cl
  54.         inc di
  55.         or dx,dx
  56.         jnz dtoc01
  57.         or ax,ax
  58.         jnz dtoc01
  59.         xor cl,cl
  60.         mov byte ptr[di],cl
  61.         dec di
  62. dtoc02: mov al,[si]
  63.         xchg [di],al
  64.         mov [si],al
  65.         inc si
  66.         dec di
  67.         cmp di,si
  68.         ja dtoc02
  69.         pop di
  70.         pop si
  71.         pop dx
  72.         pop cx
  73.         pop ax
  74.         ret
  75. dtoc endp

  76. ; show_str 函数
  77. ; 入口参数     dh : 行号
  78. ;              dl : 列号
  79. ;              cl : 颜色
  80. ;           ds:si : 字符串首地址,以字符 0 结束
  81. ; 出口参数     无
  82. show_str proc near
  83.         push ax
  84.         push dx
  85.         push si
  86.         push di
  87.         push es
  88.         mov ax,0b800h
  89.         mov es,ax
  90.         mov al,160
  91.         mul dh
  92.         mov di,ax
  93.         mov al,dl
  94.         shl al,1
  95.         cbw
  96.         add di,ax
  97.         cld
  98. show0:  lodsb
  99.         or al,al
  100.         jz show1
  101.         stosb
  102.         mov al,cl
  103.         stosb
  104.         jmp show0
  105. show1:  pop es
  106.         pop di
  107.         pop si
  108.         pop dx
  109.         pop ax
  110.         ret
  111. show_str endp

  112. ; cls 函数
  113. ; 入口参数: 无
  114. ; 出口参数: 无

  115. cls proc near
  116.         push ax
  117.         push bx
  118.         push cx
  119.         push dx
  120.         mov ax,0600h
  121.         mov bl,07h      
  122.         xor cx,cx       ; 左上角
  123.         mov dx,184fh    ; 右下角
  124.         int 10h
  125.         pop dx
  126.         pop cx
  127.         pop bx
  128.         pop ax
  129.         ret
  130. cls endp

  131. pause proc near
  132.         push ax
  133.         xor ax,ax
  134.         int 16h
  135.         pop ax
  136.         ret
  137. pause endp

  138. work proc near
  139.         push ax
  140.         push bx
  141.         push cx
  142.         push dx
  143.         push si
  144.         push di
  145.         push ds
  146.         push es
  147.         mov ax,data
  148.         mov ds,ax
  149.         mov ax,table
  150.         mov es,ax
  151.         xor di,di
  152.         mov bp,0208h
  153.         mov bx,8*21
  154.         mov cx,21
  155.         cld
  156. work01: push cx
  157.         xor si,si
  158.         mov ax,es:[di]
  159.         mov dx,es:[di+2]
  160.         mov [si],ax
  161.         mov [si+2],dx
  162.         xor al,al
  163.         mov [si+4],al
  164.         mov ax,es:[di+4*21]
  165.         mov dx,es:[di+4*21+2]
  166.         push ax
  167.         push dx
  168.         add si,10h
  169.         call dtoc
  170.         xor dx,dx
  171.         mov ax,es:[bx]
  172.         add si,10h
  173.         call dtoc
  174.         mov cx,ax
  175.         pop dx
  176.         pop ax
  177.         call divdw
  178.         add si,10h
  179.         call dtoc
  180.         xor si,si
  181.         mov dx,bp
  182.         mov cl,07
  183.         call show_str
  184.         add si,10h
  185.         add dx,16
  186.         call show_str
  187.         add si,10h
  188.         add dx,16
  189.         call show_str
  190.         add si,10h
  191.         add dx,16
  192.         call show_str
  193.         add bp,100h
  194.         add di,4
  195.         add bx,2
  196.         pop cx
  197.         loop work01
  198.         pop es
  199.         pop ds
  200.         pop di
  201.         pop si
  202.         pop dx
  203.         pop cx
  204.         pop bx
  205.         pop ax
  206.         ret
  207. work endp

  208. main proc far
  209.         call cls
  210.         call work
  211.         call pause
  212.         call cls
  213.         mov ax,4c00h
  214.         int 21h
  215. main endp
  216. code ends
  217. end main
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-18 14:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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