检测点6.1
本帖最后由 流风逸雪 于 2020-3-28 13:56 编辑(1)
assume cs:codesg
codesg segment
dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
start:
mov ax,0
mov ds,ax
mov bx,0
mov cx,8
s: mov ax,
mov cs:,ax//dw对应地址为cs:从0到定义数量*2,将ds:的数覆盖dw
add bx,2
loop s
mov ax,4c00H
int 21h
codesg ends
end start (2)
assume cs:codesg
codesg segment
dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
dw 0,0,0,0,0
start:
mov ax,cs//要将第二行作为栈空间的地址传递给ss,以便push和pop
mov ss,ax
mov sp,16
mov ax,0
mov ds,ax
mov bx,0
mov cx,8
s: push
pop cs://入栈再出栈相当于传递值
add bx,2
loop s
mov ax,4c00H
int 21h
codesg ends
end start 第二题, dw 0,0,0,0,0,0,0,0//后面是8个0
mov sp,32 红尘摆渡人 发表于 2020-3-30 22:04
第二题, dw 0,0,0,0,0,0,0,0//后面是8个0
mov sp,32
你仔细看我的注释,入栈再出栈不需要那么多0,事实上2个0就够了 本帖最后由 流风逸雪 于 2020-4-1 11:43 编辑
红尘摆渡人 发表于 2020-3-30 22:04
第二题, dw 0,0,0,0,0,0,0,0//后面是8个0
mov sp,32
其实就算0个数少于8,编译器也会分配16个00.问题在于入栈再出栈无论循环多少次占用的空间都不会超过2个0. 楼主,请问
为啥说
0个数少于8,编译器也会分配16个00, 流风逸雪 发表于 2020-4-1 10:32
你仔细看我的注释,入栈再出栈不需要那么多0,事实上2个0就够了
对的,实际上2个就够了,取决于你准备留的栈多大来设置,只要是>2 都可以 (2)题目不是要求10个字单元的栈空间吗?
怎么把题目都改了? 如果是10个字单元的栈空间,sp = 15 + 10 * 2 + 1 = 36 或 24H 结果 4BDB吗?+ 本帖最后由 qq113009 于 2021-10-12 02:41 编辑
{:5_97:} 完全错误,看的我一脸懵逼 按照题目MOV SP,34H啊,我是这样理解的 本帖最后由 snrjtg1 于 2022-2-16 19:48 编辑
怎么感觉取出来的第一个数就把栈顶给覆盖了
sp为8,一开始栈顶在0789的07上,然后第一次压入的【bx】是DS:0也就是0000:0里的数据,然后再pop cs:j是将0123中用ds:0中的数据给覆盖了,下一次就用0000:1中的数据将cd:中的数据0456给覆盖了
这是我的理解
页:
[1]