鱼C论坛

 找回密码
 立即注册
查看: 451|回复: 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段。因此,你需要添加一个类似于下面的代码段定义:
code segment
    ; 这里放置你的代码
code ends

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

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

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

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

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

经过修复后的代码如下所示:
assume cs:code, ds:data, ss:stack

data segment
    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 cx, 3
ches3:
    mov dh, ds:[si]
    push bx
    push bp
    push cx
    push di
    push si
    mov cx, 16

ches:
    inc si
    mov dl, ds:[si]
    inc di
    mov es:[di], dl
    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 20h         ; 正常退出程序的方式

code ends
end start

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 19:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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