1214087108 发表于 2020-1-1 13:03:36

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

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



-d20:0
0020:000000 00 00 00 00 00 00 2A-00 00 00 00 00 00 00 00....... *........
0020:001000 00 00 00 00 00 2A 2A-2A 00 00 00 00 00 00 00...... ***.......
0020:002000 00 00 00 00 2A 2A 2A-2A 2A 00 00 00 00 00 00..... *****......
0020:003000 00 00 00 2A 2A 2A 2A-2A 2A 2A 00 00 00 00 00.... *******.....
0020:004000 00 00 2A 2A 2A 2A 2A-2A 2A 2A 2A 00 00 00 00... *********....
0020:005000 00 2A 2A 2A 2A 2A 2A-2A 2A 2A 2A 2A 00 00 00.. ***********...
0020:006000 2A 2A 2A 2A 2A 2A 2A-2A 2A 2A 2A 2A 2A 00 00. *************..
0020:00702A 2A 2A 2A 2A 2A 2A 2A-2A 2A 2A 2A 2A 2A 2A 00****************.

人造人 发表于 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

人造人 发表于 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
       
        ; -> begin
        ; -> end
        ; -> value
       
        ; if(begin < end)
        mov        ax,
        cmp        ax,
        jae        @f
       
        ; begin[(end - begin) / 2] = value;
        mov        ax,
        sub        ax,
        xor        dx, dx
        mov        cx, 2
        div        cx
        add        ax,
        mov        bx, ax
        mov        ax,
        mov        , al
       
        ; set(begin, &begin[(end - begin) / 2], value);
        mov        ax,
        push        ax
        mov        ax,
        sub        ax,
        xor        dx, dx
        mov        cx, 2
        div        cx
        add        ax,
        push        ax
        mov        ax,
        push        ax
        call        set
        add        sp, 6
       
        ; set(&begin[(end - begin) / 2 + 1], end, value);
        mov        ax,
        push        ax
        mov        ax,
        push        ax
        mov        ax,
        sub        ax,
        xor        dx, dx
        mov        cx, 2
        div        cx
        add        ax, 1
        add        ax,
        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, &data, 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 = {0};
        for(size_t i = 0; i < 8; ++i)
        {
                set(&data, &data, 0x2A);
        }

        return 0;
}

Fowindy 发表于 2020-1-2 10:16:15

人造人 发表于 2020-1-1 21:09
我知道上面的代码不能使你满意,为了使你满意,我又耗时3小时,为你写下了如下代码,^_^




牛逼   你是真的强   向你学习

LinuxDeepin 发表于 2020-1-2 23:39:30

人造人 发表于 2020-1-1 17:48
你可没说不能直接db,那么问题就简单了
可以用简单的方法,为什么要用复杂的

超出前六章的知识量了吧,代码量感觉太大了

人造人 发表于 2020-1-2 23:42:13

LinuxDeepin 发表于 2020-1-2 23:39
超出前六章的知识量了吧,代码量感觉太大了

可以选择第一个代码呀,第一个应该没有超出范围吧

LinuxDeepin 发表于 2020-1-2 23:50:43

人造人 发表于 2020-1-2 23:42
可以选择第一个代码呀,第一个应该没有超出范围吧

第一个代码的 cld、rep、movsb、没学过{:10_282:}

LinuxDeepin 发表于 2020-1-2 23:51:18

人造人 发表于 2020-1-2 23:42
可以选择第一个代码呀,第一个应该没有超出范围吧

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

1214087108 发表于 2020-1-3 00:13:40

人造人 发表于 2020-1-1 17:48
你可没说不能直接db,那么问题就简单了
可以用简单的方法,为什么要用复杂的

好恐怖,有点看不懂了。我看我同学的有点简单。有点抄过了前六章了。小弟有点消化不了

1214087108 发表于 2020-1-3 00:16:31

LinuxDeepin 发表于 2020-1-2 23:51
感觉应该可以更简化的,我试一下能不能写出来

可不可以用MOV LOOP 用循环来做?

人造人 发表于 2020-1-3 00:20:15

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

第一个怎么样

LinuxDeepin 发表于 2020-1-3 09:50:43

本帖最后由 LinuxDeepin 于 2020-1-3 10:02 编辑

人造人 发表于 2020-1-2 23:42
可以选择第一个代码呀,第一个应该没有超出范围吧

代码写好了{:10_299:}

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,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 ,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

gang19840815 发表于 2020-1-27 17:40:00

佛挡杀佛

yjcoke 发表于 2020-2-10 21:29:23

LinuxDeepin 发表于 2020-1-3 09:50
代码写好了

前六章里的计量寄存器只有BX你的 si和di这些都超了

yjcoke 发表于 2020-2-11 12:47:17

本帖最后由 yjcoke 于 2020-2-11 13:18 编辑

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


yjcoke 发表于 2020-2-11 12:58:13

本帖最后由 yjcoke 于 2020-2-11 13:17 编辑

C语言这个太操蛋了

LinuxDeepin 发表于 2020-2-13 10:53:43

yjcoke 发表于 2020-2-11 12:47
楼主看看我写的这个,只用前六章的知识.

你好,查看你的主题没有发现相关代码,可以发上来看看吗?

LinuxDeepin 发表于 2020-2-13 10:56:55

yjcoke 发表于 2020-2-10 21:29
前六章里的计量寄存器只有BX你的 si和di这些都超了

额..后续解答时写的代码,没留意{:10_282:}

yjcoke 发表于 2020-2-13 15:59:42

本帖最后由 yjcoke 于 2020-2-13 16:01 编辑

LinuxDeepin 发表于 2020-2-13 10:53
你好,查看你的主题没有发现相关代码,可以发上来看看吗?



我上传图片,然后重新编辑,老实卡IE,可能出错了.

gang19840815 发表于 2020-2-13 19:20:19

看看
页: [1] 2
查看完整版本: 用前六章学习的程序知识怎样完成这个作业,求帮助,谢谢