鱼C论坛

 找回密码
 立即注册
查看: 711|回复: 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
    .code16
    .section    .text
    .global     _start
_start:
    # clear screen
    movw    $0x0003, %ax
    int     $0x10

    # display string
    movw    $msg, %dx
    movb    $0x09, %ah
    int     $0x21

    xorw    %di, %di
1:  xorw    %si, %si

0:  # delay 100ms
    movw    $0x0001, %cx
    movw    $0x86a0, %dx
    movb    $0x86, %ah
    int     $0x15

    # move window
    movw    %di, %cx
    movw    %di, %dx
    movb    $0, %ch
    movb    $24, %dh
    movb    $0x07, %bh
    movb    $1, %al
    movb    $0x07, %ah
    int     $0x10

    #incw    %si
    addw    $1, %si
    cmpw    $25, %si
    jb      0b
    #incw    $di
    addw    $1, %di
    cmpw    $msg_size, %di
    jb      1b

    # exit
0:  movw    $0x4c00, %ax
    int     $0x21
    jmp     0b

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

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

all: main.com

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

%: %.s

clean:
        $(RM) main.com
        $(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上成功运行。
org 100hsection .data    message db "Reading is a happy thing. For those who love reading, once they read it.", 0    length equ $ - messagesection .text    mov ax, 0b800h  ; 将视频缓冲区地址存储在ax寄存器中    mov es, ax      ; 将视频缓冲区段地址加载到es寄存器中    mov si, message ; 将message字符串的起始地址存储在si寄存器中    mov cx, length  ; 将message字符串的长度存储在cx寄存器中    mov di, 0       ; 初始化di寄存器为0,表示屏幕的第一行    add di, 160     ; 将di寄存器增加160,表示从屏幕底部滚动到顶部的位置scroll:    lodsb           ; 从si指向的内存地址读取一个字符,并将该字符加载到al寄存器中    or al, al       ; 检查al寄存器中的字符是否为零(字符串的结束标志)    jz done         ; 如果是零,则跳转到done标签处,程序结束    mov ah, 07h     ; 设置字符属性(白色文字、黑色背景)为07h    stosw           ; 将ax寄存器中的字符和属性写入es:di指向的内存地址,并自动递增di寄存器的值    add di, 2       ; 每个字符占用两个字节,所以将di寄存器递增2,以便在下一列显示字符    loop scroll     ; 循环直到所有字符都被取走并滚动到屏幕底部done:    retstart:    mov ax, 13h     ; 设置为图形模式13h(320x200像素,256色)    int 10h         ; 调用BIOS中断10h,将屏幕模式切换为13h    call scroll     ; 调用scroll子程序来实现字符滚动的效果    mov ax, 4c00h   ; 结束程序    int 21h    times 510 - ($-$$) db 0dw 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的配置文件。打开该文件,并确保以下设置是正确的:

[cpu]   core=auto      [dos]   xms=true
   保存修改后的配置文件。

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

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

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

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

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

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

文件名.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
    .code16
    .section    .text
    .global     _start
_start:
    # clear screen
    movw    $0x0003, %ax
    int     $0x10

    # display string
    movw    $msg, %dx
    movb    $0x09, %ah
    int     $0x21

    xorw    %di, %di
1:  xorw    %si, %si

0:  # delay 100ms
    movw    $0x0001, %cx
    movw    $0x86a0, %dx
    movb    $0x86, %ah
    int     $0x15

    # move window
    movw    %di, %cx
    movw    %di, %dx
    movb    $0, %ch
    movb    $24, %dh
    movb    $0x07, %bh
    movb    $1, %al
    movb    $0x07, %ah
    int     $0x10

    #incw    %si
    addw    $1, %si
    cmpw    $25, %si
    jb      0b
    #incw    $di
    addw    $1, %di
    cmpw    $msg_size, %di
    jb      1b

    # exit
0:  movw    $0x4c00, %ax
    int     $0x21
    jmp     0b

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

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

all: main.com

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

%: %.s

clean:
        $(RM) main.com
        $(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-12-22 09:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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