小亦003 发表于 2023-12-3 16:30:48

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

题目:
在屏幕的第一行显示数据belles。
Belles db "Reading is a happy thing. For those who love reading, once they read it,"        。
请根据需要编写子程序,实现:依次取走字符,并让字符从其位置跌落到屏幕底部并消失。

FishC_GPT 发表于 2023-12-3 16:31:14

下面是一段基于x86汇编语言的代码,实现了依次取走字符并让字符从其位置跌落到屏幕底部并消失的功能:

.model small
.stack 100h

.data
    Belles db "Reading is a happy thing. For those who love reading, once they read it,"

.code
main proc
    mov ax, @data
    mov ds, ax      ; 设置DS寄存器为数据段地址

    mov si, offset Belles; 将字符串的偏移地址存储在SI寄存器中

    mov ah, 0Ah   ; 设置光标位置的功能号为0Ah
    mov al, ' '   ; 光标隐藏时用空格填充

    loop:
      mov dl,     ; 将当前取得的字符存储在DL寄存器中
      cmp dl, '$'   ; 判断是否到达字符串结束符
      je end_loop   ; 如果是结束符则退出循环

      int 21h         ; 调用21h中断,设置光标位置
      mov ah, 2       ; 功能号为2表示设置光标位置
      add dh, 1       ; 将行坐标加1,相当于字符向下移动一行
      xor dl, dl      ; 列坐标设为0,回到行的起始位置
      int 21h         ; 调用21h中断,设置光标位置

      inc si          ; 字符指针自增,指向下一个字符

      jmp loop      ; 继续下一次循环

    end_loop:
    mov ah, 4Ch   ; 功能号为4Ch表示程序结束
    int 21h         ; 调用21h中断,程序结束

main endp
end main

上面的代码中,使用`int 21h`中断调用来设置光标位置,实现字符的移动效果。首先,将字符串的偏移地址存储在SI寄存器中。然后,依次取出字符放入DL寄存器,并将光标位置设置为当前行+1,列为0。然后,将SI寄存器自增,指向下一个字符,继续下一轮循环。一直循环直到遇到字符串结束符'$'为止。

请注意,这段汇编代码是基于x86架构的16位实模式,在DOS环境下运行。您需要使用比较老的汇编软件(如TASM)进行编译和运行。如果您是在其他计算机环境下进行汇编学习,请使用相应的汇编工具和相关的调用方式。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。

人造人 发表于 2023-12-23 20:06:41

你这个和另一位同学的完全一样,这里就复制一份
https://fishc.com.cn/thread-238114-1-1.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里面直接运行应该就可以

小亦003 发表于 2023-12-25 16:07:06

FishC_GPT 发表于 2023-12-3 16:31
下面是一段基于x86汇编语言的代码,实现了依次取走字符并让字符从其位置跌落到屏幕底部并消失的功能:



使用dosbox运行
页: [1]
查看完整版本: 汇编题目:依次取走字符,并让字符从其位置跌落到屏幕底部并消失。