鱼C论坛

 找回密码
 立即注册
查看: 227|回复: 1

[汇编作业] 实验9作业终于完成了

[复制链接]
发表于 2024-1-8 22:16:57 | 显示全部楼层 |阅读模式

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

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

x
assume cs:code,ds:data,ss:stack
data segment
                        ;0123456789ABCDEF
                db        'welcome to masm!'        ;定义字符
                db        01000010B,01110001b,11000010b                        ;定义色彩 010H
data ends       

stack segment
                dw        16 dup(0)
stack ends
code segment
start:        mov ax,data               
                mov ds,ax
                mov ax,stack
                mov ss,ax
                mov sp,20h
                mov bx,0b800h       
                mov es,bx
                mov di,040h               
                mov si,0
                mov bx,03c0h       
                mov bp,010h               
               
                mov cx,3
ches3:        push bx
                push bp
                push cx
                push di
                push si
                mov dh,ds:[bp]
                mov cx,16
               
                       
        ches:        mov dl,ds:[si]       
                        inc si
                        mov es:[bx+di],dl
                        inc di
                        mov es:[bx+di],dh
                        inc di
                        loop ches
                pop si
                pop di
                pop cx
                pop bp
                pop bx
                add bx,0a0h
                inc bp
                loop ches3       
       
                mov ax,4c00h
                int 21h
code ends
end start               
               
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-1-8 22:18:24 | 显示全部楼层
这段代码是用汇编语言编写的,目的是在屏幕上显示一个彩色的字符串。不过,在编译和运行这段代码之前,需要对其进行一些修复和改进。

首先,我注意到你定义了data和stack两个段,但是没有定义code段。因此,你需要添加一个类似于下面的代码段定义:

  1. code segment
  2.     ; 这里放置你的代码
  3. code ends
复制代码


接下来,我们来看看主要的代码逻辑部分。你用寄存器bx和bp保存了一些值,但是在后面并没有用到它们。如果你打算使用这两个寄存器存储其他的数据,可以继续使用它们;如果不打算使用,可以删除这两行代码。

然后,你在循环ches3中用到了lodsb指令来获取字符串的字符,但是你却没有指定lodsb的来源地址。应该把这一行代码修改为:

  1. mov dl, ds:[si]
复制代码


同时,在存储字符到显存的时候,你只给了一个es:,但是没有指定具体的偏移地址。这里应该把它修改为:

  1. mov es:[di], dl
复制代码


另外,你在loop ches3这一行之前应该把这一行移到ches3:标签的结尾,否则你的循环计数器cx将无法正确更新。

最后,结束程序的方式也可以做一个小调整。你可以使用int 20h指令来代替int 21h,这样程序会以正常的方式退出。

经过修复后的代码如下所示:

  1. assume cs:code, ds:data, ss:stack

  2. data segment
  3.     db 'welcome to masm!'  ;定义字符
  4.     db 01000010B,01110001b,11000010b  ;定义色彩 010H
  5. data ends

  6. stack segment
  7.     dw 16 dup(0)
  8. stack ends

  9. code segment
  10. start:
  11.     mov ax, data
  12.     mov ds, ax
  13.     mov ax, stack
  14.     mov ss, ax
  15.     mov sp, 20h
  16.     mov bx, 0b800h
  17.     mov es, bx
  18.     mov di, 040h
  19.     mov si, 0

  20.     mov cx, 3
  21. ches3:
  22.     mov dh, ds:[si]
  23.     push bx
  24.     push bp
  25.     push cx
  26.     push di
  27.     push si
  28.     mov cx, 16

  29. ches:
  30.     inc si
  31.     mov dl, ds:[si]
  32.     inc di
  33.     mov es:[di], dl
  34.     inc di
  35.     loop ches

  36.     pop si
  37.     pop di
  38.     pop cx
  39.     pop bp
  40.     pop bx
  41.     add bx, 0a0h
  42.     inc bp
  43.     loop ches3

  44.     mov ax, 4c00h
  45.     int 20h         ; 正常退出程序的方式

  46. code ends
  47. end start
复制代码


编译和运行这段代码后,你应该能够在屏幕上看到一个彩色的字符串了。希望能对你有所帮助!如果还有其他问题,请随时提问。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 18:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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