依次取走字符,并让字符从其位置跌落到屏幕底部并消失。
1、在屏幕的第一行显示数据belles。belles db"Reading is a happy thing. For those who love reading, once they read it." 。请根据需要编写子程序,实现:依次取走字符,并让字符从其位置跌落到屏幕底部并消失。
代码要基于8086的,可以用dosbox成功运行 可以使用汇编语言编写一个简单的程序来实现这个效果。以下是一个基于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 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2023-12-23 15:58
可以使用汇编语言编写一个简单的程序来实现这个效果。以下是一个基于NASM汇编器的示例代码,可以在DOSBox上 ...
dosbox运行不了 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 小助理,如未能正确解答您的问题,请继续追问。 你们这俩是小号?还是说同一个学校的?
这题目还挺有意思的,哪来的?
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]