用前六章学习的程序知识怎样完成这个作业,求帮助,谢谢
一、编写程序在安全空间中实现如下效果:-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****************.
你可没说不能直接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 我知道上面的代码不能使你满意,为了使你满意,我又耗时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;
} 人造人 发表于 2020-1-1 21:09
我知道上面的代码不能使你满意,为了使你满意,我又耗时3小时,为你写下了如下代码,^_^
牛逼 你是真的强 向你学习 人造人 发表于 2020-1-1 17:48
你可没说不能直接db,那么问题就简单了
可以用简单的方法,为什么要用复杂的
超出前六章的知识量了吧,代码量感觉太大了 LinuxDeepin 发表于 2020-1-2 23:39
超出前六章的知识量了吧,代码量感觉太大了
可以选择第一个代码呀,第一个应该没有超出范围吧
人造人 发表于 2020-1-2 23:42
可以选择第一个代码呀,第一个应该没有超出范围吧
第一个代码的 cld、rep、movsb、没学过{:10_282:} 人造人 发表于 2020-1-2 23:42
可以选择第一个代码呀,第一个应该没有超出范围吧
感觉应该可以更简化的,我试一下能不能写出来 人造人 发表于 2020-1-1 17:48
你可没说不能直接db,那么问题就简单了
可以用简单的方法,为什么要用复杂的
好恐怖,有点看不懂了。我看我同学的有点简单。有点抄过了前六章了。小弟有点消化不了
LinuxDeepin 发表于 2020-1-2 23:51
感觉应该可以更简化的,我试一下能不能写出来
可不可以用MOV LOOP 用循环来做?
1214087108 发表于 2020-1-3 00:13
好恐怖,有点看不懂了。我看我同学的有点简单。有点抄过了前六章了。小弟有点消化不了
第一个怎么样 本帖最后由 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
佛挡杀佛 LinuxDeepin 发表于 2020-1-3 09:50
代码写好了
前六章里的计量寄存器只有BX你的 si和di这些都超了 本帖最后由 yjcoke 于 2020-2-11 13:18 编辑
楼主看看我写的这个,只用前六章的知识.
本帖最后由 yjcoke 于 2020-2-11 13:17 编辑
C语言这个太操蛋了 yjcoke 发表于 2020-2-11 12:47
楼主看看我写的这个,只用前六章的知识.
你好,查看你的主题没有发现相关代码,可以发上来看看吗? yjcoke 发表于 2020-2-10 21:29
前六章里的计量寄存器只有BX你的 si和di这些都超了
额..后续解答时写的代码,没留意{:10_282:} 本帖最后由 yjcoke 于 2020-2-13 16:01 编辑
LinuxDeepin 发表于 2020-2-13 10:53
你好,查看你的主题没有发现相关代码,可以发上来看看吗?
我上传图片,然后重新编辑,老实卡IE,可能出错了. 看看
页:
[1]
2