鱼C论坛

 找回密码
 立即注册
查看: 3529|回复: 21

[已解决]用前六章学习的程序知识怎样完成这个作业,求帮助,谢谢

[复制链接]
发表于 2020-1-1 13:03:36 | 显示全部楼层 |阅读模式

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

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

x
一、编写程序在安全空间中实现如下效果:



-d20:0
0020:0000  00 00 00 00 00 00 00 2A-00 00 00 00 00 00 00 00  ....... *........
0020:0010  00 00 00 00 00 00 2A 2A-2A 00 00 00 00 00 00 00  ...... ***.......
0020:0020  00 00 00 00 00 2A 2A 2A-2A 2A 00 00 00 00 00 00  ..... *****......
0020:0030  00 00 00 00 2A 2A 2A 2A-2A 2A 2A 00 00 00 00 00  .... *******.....
0020:0040  00 00 00 2A 2A 2A 2A 2A-2A 2A 2A 2A 00 00 00 00  ... *********....
0020:0050  00 00 2A 2A 2A 2A 2A 2A-2A 2A 2A 2A 2A 00 00 00  .. ***********...
0020:0060  00 2A 2A 2A 2A 2A 2A 2A-2A 2A 2A 2A 2A 2A 00 00  . *************..
0020:0070  2A 2A 2A 2A 2A 2A 2A 2A-2A 2A 2A 2A 2A 2A 2A 00  ****************.
最佳答案
2020-2-13 15:59:42
本帖最后由 yjcoke 于 2020-2-13 16:01 编辑
LinuxDeepin 发表于 2020-2-13 10:53
你好,查看你的主题没有发现相关代码,可以发上来看看吗?




我上传图片,然后重新编辑,老实卡IE,可能出错了.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-1 17:48:48 | 显示全部楼层
你可没说不能直接db,那么问题就简单了
可以用简单的方法,为什么要用复杂的
assume cs:code, ds:data

stack segment
        db 1024 dup(?)
stack ends

data segment
        db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 2Ah, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
        db 00h, 00h, 00h, 00h, 00h, 00h, 2Ah, 2Ah, 2Ah, 00h, 00h, 00h, 00h, 00h, 00h, 00h
        db 00h, 00h, 00h, 00h, 00h, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 00h, 00h, 00h, 00h, 00h, 00h
        db 00h, 00h, 00h, 00h, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 00h, 00h, 00h, 00h, 00h
        db 00h, 00h, 00h, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 00h, 00h, 00h, 00h
        db 00h, 00h, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 00h, 00h, 00h
        db 00h, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 00h, 00h
        db 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 00h
data ends

code segment
start:
        mov        ax, data
        mov        ds, ax
        mov        ax, stack
        mov        ss, ax
        mov        sp, 1024
        
        mov        cx, 8 * 16
        xor        ax, ax
        mov        es, ax
        mov        di, 200h
        xor        si, si
        cld
        rep        movsb
        
        mov        ax, 4c00h
        int        21h
code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-1 21:09:36 | 显示全部楼层
我知道上面的代码不能使你满意,为了使你满意,我又耗时3小时,为你写下了如下代码,^_^
assume cs:code, ds:data

stack segment
        db 1024 dup(?)
stack ends

data segment
        db 16 dup(0)
        db 16 dup(0)
        db 16 dup(0)
        db 16 dup(0)
        db 16 dup(0)
        db 16 dup(0)
        db 16 dup(0)
        db 16 dup(0)
data ends

code segment
; void set(uint8_t *begin, uint8_t *end, uint8_t value)
set:
        push        bp
        mov        bp, sp
        push        bx
        
        ; [bp + 4] -> begin
        ; [bp + 6] -> end
        ; [bp + 8] -> value
        
        ; if(begin < end)
        mov        ax, [bp + 4]
        cmp        ax, [bp + 6]
        jae        @f
        
        ; begin[(end - begin) / 2] = value;
        mov        ax, [bp + 6]
        sub        ax, [bp + 4]
        xor        dx, dx
        mov        cx, 2
        div        cx
        add        ax, [bp + 4]
        mov        bx, ax
        mov        ax, [bp + 8]
        mov        [bx], al
        
        ; set(begin, &begin[(end - begin) / 2], value);
        mov        ax, [bp + 8]
        push        ax
        mov        ax, [bp + 6]
        sub        ax, [bp + 4]
        xor        dx, dx
        mov        cx, 2
        div        cx
        add        ax, [bp + 4]
        push        ax
        mov        ax, [bp + 4]
        push        ax
        call        set
        add        sp, 6
        
        ; set(&begin[(end - begin) / 2 + 1], end, value);
        mov        ax, [bp + 8]
        push        ax
        mov        ax, [bp + 6]
        push        ax
        mov        ax, [bp + 6]
        sub        ax, [bp + 4]
        xor        dx, dx
        mov        cx, 2
        div        cx
        add        ax, 1
        add        ax, [bp + 4]
        push        ax
        call        set
        add        sp, 6
@@:
        pop        bx
        mov        sp, bp
        pop        bp
        ret
start:
        mov        ax, data
        mov        ds, ax
        mov        ax, stack
        mov        ss, ax
        mov        sp, 1024
        
        ; for(uint16_t i = 0; i < 8; ++i)
        xor        si, si
        jmp        L1
L2:
        ; set(&data[7 - i][i], &data[7 - i][15 - i], 0x2A);
        mov        ax, 2Ah
        push        ax
        mov        ax, 7
        sub        ax, si
        mov        cl, 4
        shl        ax, cl
        mov        cx, 15
        sub        cx, si
        add        ax, cx
        push        ax
        mov        ax, 7
        sub        ax, si
        mov        cl, 4
        shl        ax, cl
        add        ax, si
        push        ax
        call        set
        add        sp, 6
        inc        si
L1:
        cmp        si, 8
        jb        L2
        
        ; copy to 200h
        mov        cx, 8 * 16
        xor        ax, ax
        mov        es, ax
        mov        di, 200h
        xor        si, si
        cld
        rep        movsb
        
        mov        ax, 4c00h
        int        21h
code ends
end start

以上代码完全就是如下C语言代码的机械翻译,说真的,人工翻译好累呀,真的^_^
这种事情还是交给编译器比较好
#include <stdio.h>

void set(size_t *begin, size_t *end, size_t value)
{
        if(begin < end)
        {
                begin[(end - begin) / 2] = value;
                set(begin, &begin[(end - begin) / 2], value);
                set(&begin[(end - begin) / 2 + 1], end, value);
        }
}

int main(void)
{
        size_t data[8][16] = {0};
        for(size_t i = 0; i < 8; ++i)
        {
                set(&data[7 - i][i], &data[7 - i][15 - i], 0x2A);
        }

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-1-2 10:16:15 | 显示全部楼层
人造人 发表于 2020-1-1 21:09
我知道上面的代码不能使你满意,为了使你满意,我又耗时3小时,为你写下了如下代码,^_^

牛逼   你是真的强   向你学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-2 23:39:30 | 显示全部楼层
人造人 发表于 2020-1-1 17:48
你可没说不能直接db,那么问题就简单了
可以用简单的方法,为什么要用复杂的

超出前六章的知识量了吧,代码量感觉太大了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-2 23:42:13 | 显示全部楼层
LinuxDeepin 发表于 2020-1-2 23:39
超出前六章的知识量了吧,代码量感觉太大了

可以选择第一个代码呀,第一个应该没有超出范围吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-2 23:50:43 | 显示全部楼层
人造人 发表于 2020-1-2 23:42
可以选择第一个代码呀,第一个应该没有超出范围吧

第一个代码的 cld、rep、movsb、没学过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-2 23:51:18 | 显示全部楼层
人造人 发表于 2020-1-2 23:42
可以选择第一个代码呀,第一个应该没有超出范围吧

感觉应该可以更简化的,我试一下能不能写出来

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
人造人 + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

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

使用道具 举报

 楼主| 发表于 2020-1-3 00:13:40 | 显示全部楼层
人造人 发表于 2020-1-1 17:48
你可没说不能直接db,那么问题就简单了
可以用简单的方法,为什么要用复杂的

好恐怖,有点看不懂了。我看我同学的有点简单。有点抄过了前六章了。小弟有点消化不了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-3 00:16:31 | 显示全部楼层
LinuxDeepin 发表于 2020-1-2 23:51
感觉应该可以更简化的,我试一下能不能写出来

可不可以用MOV LOOP [DX]用循环来做?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-3 00:20:15 | 显示全部楼层
1214087108 发表于 2020-1-3 00:13
好恐怖,有点看不懂了。我看我同学的有点简单。有点抄过了前六章了。小弟有点消化不了

第一个怎么样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-3 09:50:43 | 显示全部楼层
本帖最后由 LinuxDeepin 于 2020-1-3 10:02 编辑
人造人 发表于 2020-1-2 23:42
可以选择第一个代码呀,第一个应该没有超出范围吧


代码写好了
assume cs:codesg, ss:stacksg

stacksg segment
        dd 16 dup(2)
stacksg ends

codesg segment

        start:
                mov ax,20H                ;; ds定位到安全空间
                mov ds,ax
                mov bx,0
                mov ax,stacksg            ;; 栈段分配、栈顶定位
                mov ss,ax
                mov sp,10H

                mov cx,40H                ;; 安全空间区域置0
        s1:     mov word ptr[bx],0        
                add bx,2
                loop s1
                
                mov si,7                  ;; 始列地址
                mov di,1                  ;; 每行写入数量
                mov bx,0                  ;; 始行地址
                mov al,2aH                ;; 星符号
                mov cx,8                  ;; 八行,循环八次
                
        s2:     push cx                   ;; 行循环次数保存
                push si                   ;; 始列地址保存
                
                mov cx,di                 ;; 循环写入星符号
        s3:     mov [bx+si],al                
                inc si                                
                loop s3
                
                pop si                    ;; 始列地址恢复
                pop cx                    ;; 行循环次数恢复
                dec si                    ;; 始列地址减1
                add di,2                  ;; 写入数量加2
                add bx,10H                ;; 始行地址变更
                loop s2
                
                mov ax,4c00H
                int 21H
                
codesg ends

end start

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
人造人 + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

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

使用道具 举报

发表于 2020-1-27 17:40:00 | 显示全部楼层
佛挡杀佛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-10 21:29:23 | 显示全部楼层

前六章里的计量寄存器只有BX  你的 si和di这些都超了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-11 12:47:17 | 显示全部楼层
本帖最后由 yjcoke 于 2020-2-11 13:18 编辑

楼主看看我写的这个,只用前六章的知识.


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

使用道具 举报

发表于 2020-2-11 12:58:13 | 显示全部楼层
本帖最后由 yjcoke 于 2020-2-11 13:17 编辑

C语言这个太操蛋了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-13 10:53:43 | 显示全部楼层
yjcoke 发表于 2020-2-11 12:47
楼主看看我写的这个,只用前六章的知识.

你好,查看你的主题没有发现相关代码,可以发上来看看吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-13 10:56:55 | 显示全部楼层
yjcoke 发表于 2020-2-10 21:29
前六章里的计量寄存器只有BX  你的 si和di这些都超了

额..后续解答时写的代码,没留意
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-13 15:59:42 | 显示全部楼层    本楼为最佳答案   
本帖最后由 yjcoke 于 2020-2-13 16:01 编辑
LinuxDeepin 发表于 2020-2-13 10:53
你好,查看你的主题没有发现相关代码,可以发上来看看吗?




我上传图片,然后重新编辑,老实卡IE,可能出错了.
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-13 19:20:19 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-25 02:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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