鱼C论坛

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

[已解决]依次取走字符,并让字符从其位置跌落到屏幕底部并消失。

[复制链接]
发表于 2023-12-23 15:58:10 | 显示全部楼层 |阅读模式

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

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

x
1、在屏幕的第一行显示数据belles。
belles        db  "Reading is a happy thing. For those who love reading, once they read it."        。请根据需要编写子程序,实现:依次取走字符,并让字符从其位置跌落到屏幕底部并消失。
代码要基于8086的,可以用dosbox成功运行
最佳答案
2023-12-23 19:58:02
你们这俩是小号?还是说同一个学校的?
这题目还挺有意思的,哪来的?
https://fishc.com.cn/thread-237247-1-2.html

我这边的masm汇编器不是很方便用,我就直接用gnu的as汇编器了

main.s
  1.     .code16
  2.     .section    .text
  3.     .global     _start
  4. _start:
  5.     # clear screen
  6.     movw    $0x0003, %ax
  7.     int     $0x10

  8.     # display string
  9.     movw    $msg, %dx
  10.     movb    $0x09, %ah
  11.     int     $0x21

  12.     xorw    %di, %di
  13. 1:  xorw    %si, %si

  14. 0:  # delay 100ms
  15.     movw    $0x0001, %cx
  16.     movw    $0x86a0, %dx
  17.     movb    $0x86, %ah
  18.     int     $0x15

  19.     # move window
  20.     movw    %di, %cx
  21.     movw    %di, %dx
  22.     movb    $0, %ch
  23.     movb    $24, %dh
  24.     movb    $0x07, %bh
  25.     movb    $1, %al
  26.     movb    $0x07, %ah
  27.     int     $0x10

  28.     #incw    %si
  29.     addw    $1, %si
  30.     cmpw    $25, %si
  31.     jb      0b
  32.     #incw    $di
  33.     addw    $1, %di
  34.     cmpw    $msg_size, %di
  35.     jb      1b

  36.     # exit
  37. 0:  movw    $0x4c00, %ax
  38.     int     $0x21
  39.     jmp     0b

  40. msg:    .ascii "Reading is a happy thing. For those who love reading, once they read it.$"
  41.         .equ   msg_size, . - msg - 1
复制代码


Makefile
  1. ASFLAGS = --32 -g -mx86-used-note=no
  2. LDFLAGS = -m elf_i386 -Ttext 0x100
  3. LINK.o  = $(LD) $(LDFLAGS)

  4. all: main.com

  5. main.com: main
  6.         objcopy -O binary -S -g $< $@

  7. %: %.s

  8. clean:
  9.         $(RM) main.com
  10.         $(RM) main
复制代码


下面是效果图
2023-12-23-193041_1920x1080_scrot.jpg
2023-12-23-193049_1920x1080_scrot.jpg
2023-12-23-193143_1920x1080_scrot.jpg
2023-12-23-193148_1920x1080_scrot.jpg
2023-12-23-193327_1920x1080_scrot.jpg
2023-12-23-193523_1920x1080_scrot.jpg
2023-12-23-193542_1920x1080_scrot.jpg

考虑到你那边可能也没有我的环境,就发一下最终的可执行程序吧
把main.com文件复制到dosbox里面直接运行应该就可以
ms-dos.zip (1.95 KB, 下载次数: 0)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-23 15:58:46 | 显示全部楼层
可以使用汇编语言编写一个简单的程序来实现这个效果。以下是一个基于NASM汇编器的示例代码,可以在DOSBox上成功运行。
  1. org 100h
  2. section .data
  3.     message db "Reading is a happy thing. For those who love reading, once they read it.", 0
  4.     length equ $ - message
  5. section .text
  6.     mov ax, 0b800h  ; 将视频缓冲区地址存储在ax寄存器中
  7.     mov es, ax      ; 将视频缓冲区段地址加载到es寄存器中
  8.     mov si, message ; 将message字符串的起始地址存储在si寄存器中
  9.     mov cx, length  ; 将message字符串的长度存储在cx寄存器中
  10.     mov di, 0       ; 初始化di寄存器为0,表示屏幕的第一行
  11.     add di, 160     ; 将di寄存器增加160,表示从屏幕底部滚动到顶部的位置
  12. scroll:
  13.     lodsb           ; 从si指向的内存地址读取一个字符,并将该字符加载到al寄存器中
  14.     or al, al       ; 检查al寄存器中的字符是否为零(字符串的结束标志)
  15.     jz done         ; 如果是零,则跳转到done标签处,程序结束
  16.     mov ah, 07h     ; 设置字符属性(白色文字、黑色背景)为07h
  17.     stosw           ; 将ax寄存器中的字符和属性写入es:di指向的内存地址,并自动递增di寄存器的值
  18.     add di, 2       ; 每个字符占用两个字节,所以将di寄存器递增2,以便在下一列显示字符
  19.     loop scroll     ; 循环直到所有字符都被取走并滚动到屏幕底部
  20. done:
  21.     ret
  22. start:
  23.     mov ax, 13h     ; 设置为图形模式13h(320x200像素,256色)
  24.     int 10h         ; 调用BIOS中断10h,将屏幕模式切换为13h
  25.     call scroll     ; 调用scroll子程序来实现字符滚动的效果
  26.     mov ax, 4c00h   ; 结束程序
  27.     int 21h   
  28. times 510 - ($-$$) db 0
  29. dw 0aa55h
复制代码

请注意,此代码使用的是16位实模式汇编。您可以使用NASM汇编器将其转换为可执行文件。为了使用DOSBox成功运行,请确保您的汇编器生成的可执行文件扩展名为COM,并将其放置在DOSBox设置的目录中。

当然,这只是一个简单的示例程序,可以让字符从顶部滚动到底部消失。您可以根据需要进行修改和扩展,以实现更复杂的字符动画效果。

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

使用道具 举报

 楼主| 发表于 2023-12-23 16:08:01 | 显示全部楼层
FishC 发表于 2023-12-23 15:58
可以使用汇编语言编写一个简单的程序来实现这个效果。以下是一个基于NASM汇编器的示例代码,可以在DOSBox上 ...

dosbox运行不了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-23 16:08:09 | 显示全部楼层

如果DOSBox无法运行汇编程序,请确保您已正确安装并配置了DOSBox。以下是一些可能的解决方法:

1. 确保您已在计算机上正确安装DOSBox。您可以从DOSBox官方网站(https://www.dosbox.com)下载适用于您的操作系统的最新版本。

2. 打开DOSBox并检查其配置文件。在DOSBox安装目录中,您将找到一个名为dosbox.conf的配置文件。打开该文件,并确保以下设置是正确的:

  
  1. [cpu]
  2.    core=auto
  3.    
  4.    [dos]
  5.    xms=true
复制代码

   保存修改后的配置文件。

3. 将汇编程序的源代码保存到一个单独的文件中,并将文件扩展名保存为.asm。确保您提供的汇编代码是与您使用的汇编器兼容的。

4. 将.asm文件放置在您配置DOSBox时指定的某个文件夹中,例如DOSBox的C盘虚拟硬盘。

5. 打开DOSBox,并使用`mount`命令将DOSBox连接到您保存.asm文件的文件夹。例如,如果您将.asm文件保存在C:\asm文件夹中,那么您可以使用以下命令将DOSBox连接到该文件夹:

  
  1. mount c: c:\asm
复制代码

6. 使用`c:`命令切换到C盘:

  
  1. c:
复制代码

7. 使用您选择的汇编器将.asm文件编译为可执行文件。例如,如果您使用TASM,则可以使用以下命令进行编译:

  
  1. tasm 文件名.asm
复制代码

8. 运行编译后生成的可执行文件。

  
  1. 文件名.com
复制代码

如果您遇到任何错误消息或问题,请尝试搜寻DOSBox的文档或参考DOSBox的论坛或社区,以获取更多帮助和支持。

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

使用道具 举报

发表于 2023-12-23 19:58:02 | 显示全部楼层    本楼为最佳答案   
你们这俩是小号?还是说同一个学校的?
这题目还挺有意思的,哪来的?
https://fishc.com.cn/thread-237247-1-2.html

我这边的masm汇编器不是很方便用,我就直接用gnu的as汇编器了

main.s
  1.     .code16
  2.     .section    .text
  3.     .global     _start
  4. _start:
  5.     # clear screen
  6.     movw    $0x0003, %ax
  7.     int     $0x10

  8.     # display string
  9.     movw    $msg, %dx
  10.     movb    $0x09, %ah
  11.     int     $0x21

  12.     xorw    %di, %di
  13. 1:  xorw    %si, %si

  14. 0:  # delay 100ms
  15.     movw    $0x0001, %cx
  16.     movw    $0x86a0, %dx
  17.     movb    $0x86, %ah
  18.     int     $0x15

  19.     # move window
  20.     movw    %di, %cx
  21.     movw    %di, %dx
  22.     movb    $0, %ch
  23.     movb    $24, %dh
  24.     movb    $0x07, %bh
  25.     movb    $1, %al
  26.     movb    $0x07, %ah
  27.     int     $0x10

  28.     #incw    %si
  29.     addw    $1, %si
  30.     cmpw    $25, %si
  31.     jb      0b
  32.     #incw    $di
  33.     addw    $1, %di
  34.     cmpw    $msg_size, %di
  35.     jb      1b

  36.     # exit
  37. 0:  movw    $0x4c00, %ax
  38.     int     $0x21
  39.     jmp     0b

  40. msg:    .ascii "Reading is a happy thing. For those who love reading, once they read it.$"
  41.         .equ   msg_size, . - msg - 1
复制代码


Makefile
  1. ASFLAGS = --32 -g -mx86-used-note=no
  2. LDFLAGS = -m elf_i386 -Ttext 0x100
  3. LINK.o  = $(LD) $(LDFLAGS)

  4. all: main.com

  5. main.com: main
  6.         objcopy -O binary -S -g $< $@

  7. %: %.s

  8. clean:
  9.         $(RM) main.com
  10.         $(RM) main
复制代码


下面是效果图
2023-12-23-193041_1920x1080_scrot.jpg
2023-12-23-193049_1920x1080_scrot.jpg
2023-12-23-193143_1920x1080_scrot.jpg
2023-12-23-193148_1920x1080_scrot.jpg
2023-12-23-193327_1920x1080_scrot.jpg
2023-12-23-193523_1920x1080_scrot.jpg
2023-12-23-193542_1920x1080_scrot.jpg

考虑到你那边可能也没有我的环境,就发一下最终的可执行程序吧
把main.com文件复制到dosbox里面直接运行应该就可以
ms-dos.zip (1.95 KB, 下载次数: 0)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 22:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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