鱼C论坛

 找回密码
 立即注册
查看: 2909|回复: 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,那么问题就简单了
可以用简单的方法,为什么要用复杂的

  1. assume cs:code, ds:data

  2. stack segment
  3.         db 1024 dup(?)
  4. stack ends

  5. data segment
  6.         db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 2Ah, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
  7.         db 00h, 00h, 00h, 00h, 00h, 00h, 2Ah, 2Ah, 2Ah, 00h, 00h, 00h, 00h, 00h, 00h, 00h
  8.         db 00h, 00h, 00h, 00h, 00h, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 00h, 00h, 00h, 00h, 00h, 00h
  9.         db 00h, 00h, 00h, 00h, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 00h, 00h, 00h, 00h, 00h
  10.         db 00h, 00h, 00h, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 00h, 00h, 00h, 00h
  11.         db 00h, 00h, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 00h, 00h, 00h
  12.         db 00h, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 00h, 00h
  13.         db 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 2Ah, 00h
  14. data ends

  15. code segment
  16. start:
  17.         mov        ax, data
  18.         mov        ds, ax
  19.         mov        ax, stack
  20.         mov        ss, ax
  21.         mov        sp, 1024
  22.        
  23.         mov        cx, 8 * 16
  24.         xor        ax, ax
  25.         mov        es, ax
  26.         mov        di, 200h
  27.         xor        si, si
  28.         cld
  29.         rep        movsb
  30.        
  31.         mov        ax, 4c00h
  32.         int        21h
  33. code ends
  34. end start
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

  1. assume cs:code, ds:data

  2. stack segment
  3.         db 1024 dup(?)
  4. stack ends

  5. data segment
  6.         db 16 dup(0)
  7.         db 16 dup(0)
  8.         db 16 dup(0)
  9.         db 16 dup(0)
  10.         db 16 dup(0)
  11.         db 16 dup(0)
  12.         db 16 dup(0)
  13.         db 16 dup(0)
  14. data ends

  15. code segment
  16. ; void set(uint8_t *begin, uint8_t *end, uint8_t value)
  17. set:
  18.         push        bp
  19.         mov        bp, sp
  20.         push        bx
  21.        
  22.         ; [bp + 4] -> begin
  23.         ; [bp + 6] -> end
  24.         ; [bp + 8] -> value
  25.        
  26.         ; if(begin < end)
  27.         mov        ax, [bp + 4]
  28.         cmp        ax, [bp + 6]
  29.         jae        @f
  30.        
  31.         ; begin[(end - begin) / 2] = value;
  32.         mov        ax, [bp + 6]
  33.         sub        ax, [bp + 4]
  34.         xor        dx, dx
  35.         mov        cx, 2
  36.         div        cx
  37.         add        ax, [bp + 4]
  38.         mov        bx, ax
  39.         mov        ax, [bp + 8]
  40.         mov        [bx], al
  41.        
  42.         ; set(begin, &begin[(end - begin) / 2], value);
  43.         mov        ax, [bp + 8]
  44.         push        ax
  45.         mov        ax, [bp + 6]
  46.         sub        ax, [bp + 4]
  47.         xor        dx, dx
  48.         mov        cx, 2
  49.         div        cx
  50.         add        ax, [bp + 4]
  51.         push        ax
  52.         mov        ax, [bp + 4]
  53.         push        ax
  54.         call        set
  55.         add        sp, 6
  56.        
  57.         ; set(&begin[(end - begin) / 2 + 1], end, value);
  58.         mov        ax, [bp + 8]
  59.         push        ax
  60.         mov        ax, [bp + 6]
  61.         push        ax
  62.         mov        ax, [bp + 6]
  63.         sub        ax, [bp + 4]
  64.         xor        dx, dx
  65.         mov        cx, 2
  66.         div        cx
  67.         add        ax, 1
  68.         add        ax, [bp + 4]
  69.         push        ax
  70.         call        set
  71.         add        sp, 6
  72. @@:
  73.         pop        bx
  74.         mov        sp, bp
  75.         pop        bp
  76.         ret
  77. start:
  78.         mov        ax, data
  79.         mov        ds, ax
  80.         mov        ax, stack
  81.         mov        ss, ax
  82.         mov        sp, 1024
  83.        
  84.         ; for(uint16_t i = 0; i < 8; ++i)
  85.         xor        si, si
  86.         jmp        L1
  87. L2:
  88.         ; set(&data[7 - i][i], &data[7 - i][15 - i], 0x2A);
  89.         mov        ax, 2Ah
  90.         push        ax
  91.         mov        ax, 7
  92.         sub        ax, si
  93.         mov        cl, 4
  94.         shl        ax, cl
  95.         mov        cx, 15
  96.         sub        cx, si
  97.         add        ax, cx
  98.         push        ax
  99.         mov        ax, 7
  100.         sub        ax, si
  101.         mov        cl, 4
  102.         shl        ax, cl
  103.         add        ax, si
  104.         push        ax
  105.         call        set
  106.         add        sp, 6
  107.         inc        si
  108. L1:
  109.         cmp        si, 8
  110.         jb        L2
  111.        
  112.         ; copy to 200h
  113.         mov        cx, 8 * 16
  114.         xor        ax, ax
  115.         mov        es, ax
  116.         mov        di, 200h
  117.         xor        si, si
  118.         cld
  119.         rep        movsb
  120.        
  121.         mov        ax, 4c00h
  122.         int        21h
  123. code ends
  124. end start
复制代码


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

  1. #include <stdio.h>

  2. void set(size_t *begin, size_t *end, size_t value)
  3. {
  4.         if(begin < end)
  5.         {
  6.                 begin[(end - begin) / 2] = value;
  7.                 set(begin, &begin[(end - begin) / 2], value);
  8.                 set(&begin[(end - begin) / 2 + 1], end, value);
  9.         }
  10. }

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

  18.         return 0;
  19. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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
可以选择第一个代码呀,第一个应该没有超出范围吧


代码写好了

  1. assume cs:codesg, ss:stacksg

  2. stacksg segment
  3.         dd 16 dup(2)
  4. stacksg ends

  5. codesg segment

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

  13.                 mov cx,40H                ;; 安全空间区域置0
  14.         s1:     mov word ptr[bx],0       
  15.                 add bx,2
  16.                 loop s1
  17.                
  18.                 mov si,7                  ;; 始列地址
  19.                 mov di,1                  ;; 每行写入数量
  20.                 mov bx,0                  ;; 始行地址
  21.                 mov al,2aH                ;; 星符号
  22.                 mov cx,8                  ;; 八行,循环八次
  23.                
  24.         s2:     push cx                   ;; 行循环次数保存
  25.                 push si                   ;; 始列地址保存
  26.                
  27.                 mov cx,di                 ;; 循环写入星符号
  28.         s3:     mov [bx+si],al               
  29.                 inc si                               
  30.                 loop s3
  31.                
  32.                 pop si                    ;; 始列地址恢复
  33.                 pop cx                    ;; 行循环次数恢复
  34.                 dec si                    ;; 始列地址减1
  35.                 add di,2                  ;; 写入数量加2
  36.                 add bx,10H                ;; 始行地址变更
  37.                 loop s2
  38.                
  39.                 mov ax,4c00H
  40.                 int 21H
  41.                
  42. codesg ends

  43. 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-4-20 15:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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