linyuhui 发表于 2023-12-23 15:58:10

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

1、在屏幕的第一行显示数据belles。
belles        db"Reading is a happy thing. For those who love reading, once they read it."        。请根据需要编写子程序,实现:依次取走字符,并让字符从其位置跌落到屏幕底部并消失。
代码要基于8086的,可以用dosbox成功运行

FishC 发表于 2023-12-23 15:58:46

可以使用汇编语言编写一个简单的程序来实现这个效果。以下是一个基于NASM汇编器的示例代码,可以在DOSBox上成功运行。

org 100h

section .data
    message db "Reading is a happy thing. For those who love reading, once they read it.", 0
    length equ $ - message

section .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:
    ret

start:
    mov ax, 13h   ; 设置为图形模式13h(320x200像素,256色)
    int 10h         ; 调用BIOS中断10h,将屏幕模式切换为13h

    call scroll   ; 调用scroll子程序来实现字符滚动的效果

    mov ax, 4c00h   ; 结束程序
    int 21h   

times 510 - ($-$$) db 0
dw 0aa55h

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

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

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

linyuhui 发表于 2023-12-23 16:08:01

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

dosbox运行不了

FishC 发表于 2023-12-23 16:08:09

linyuhui 发表于 2023-12-23 16:08
dosbox运行不了

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

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

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

   
   core=auto
   
   
   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 小助理,如未能正确解答您的问题,请继续追问。

人造人 发表于 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


下面是效果图








考虑到你那边可能也没有我的环境,就发一下最终的可执行程序吧
把main.com文件复制到dosbox里面直接运行应该就可以
页: [1]
查看完整版本: 依次取走字符,并让字符从其位置跌落到屏幕底部并消失。