鱼C论坛

 找回密码
 立即注册
查看: 518|回复: 3

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

[复制链接]
发表于 2023-12-3 16:30:48 | 显示全部楼层 |阅读模式

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

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

x
题目:
在屏幕的第一行显示数据belles。
Belles db "Reading is a happy thing. For those who love reading, once they read it,"        。
请根据需要编写子程序,实现:依次取走字符,并让字符从其位置跌落到屏幕底部并消失。
最佳答案
2023-12-23 20:06:41
你这个和另一位同学的完全一样,这里就复制一份
https://fishc.com.cn/thread-238114-1-1.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, 下载次数: 1)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-3 16:31:14 | 显示全部楼层
下面是一段基于x86汇编语言的代码,实现了依次取走字符并让字符从其位置跌落到屏幕底部并消失的功能:
  1. .model small
  2. .stack 100h
  3. .data
  4.     Belles db "Reading is a happy thing. For those who love reading, once they read it,"
  5. .code
  6. main proc
  7.     mov ax, @data
  8.     mov ds, ax      ; 设置DS寄存器为数据段地址
  9.     mov si, offset Belles  ; 将字符串的偏移地址存储在SI寄存器中
  10.     mov ah, 0Ah     ; 设置光标位置的功能号为0Ah
  11.     mov al, ' '     ; 光标隐藏时用空格填充
  12.     loop:
  13.         mov dl, [si]    ; 将当前取得的字符存储在DL寄存器中
  14.         cmp dl, '$'     ; 判断是否到达字符串结束符
  15.         je end_loop     ; 如果是结束符则退出循环
  16.         int 21h         ; 调用21h中断,设置光标位置
  17.         mov ah, 2       ; 功能号为2表示设置光标位置
  18.         add dh, 1       ; 将行坐标加1,相当于字符向下移动一行
  19.         xor dl, dl      ; 列坐标设为0,回到行的起始位置
  20.         int 21h         ; 调用21h中断,设置光标位置
  21.         inc si          ; 字符指针自增,指向下一个字符
  22.         jmp loop        ; 继续下一次循环
  23.     end_loop:
  24.     mov ah, 4Ch     ; 功能号为4Ch表示程序结束
  25.     int 21h         ; 调用21h中断,程序结束
  26. main endp
  27. end main
复制代码

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

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

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

使用道具 举报

发表于 2023-12-23 20:06:41 | 显示全部楼层    本楼为最佳答案   
你这个和另一位同学的完全一样,这里就复制一份
https://fishc.com.cn/thread-238114-1-1.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, 下载次数: 1)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 01:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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