作者operationcow (香蕉公车)
看板ASM
标题[问题] 新手发问 masm 的 assembly
时间Wed May 20 20:54:34 2009
小弟我是新手, 目前正在看大陆 王爽 的 "汇编语言"
里面有一题习题, 我做了以後有点疑义
来这边请教各位大大
题目如下
下面的程序实现依次用内存 0:0 ~ 0:15 单元中的内容改写程序中的数据, 数据
的传送用栈来进行. 栈空间设置在程序内.完成程序:
(注: 下面的程序目的依次是用 memory 里面 0:0 ~ 0:15 依次改写程序中 0123H
~ 0987H 这段, 利用 stack 来搬移资料, 以下三个 __ 是需要填上指令的部分)
assume cs:codesg
codesg segment
dw 0123H, 0456H, 0789H, 0abcH, 0defh, 0fedh, 0cbah, 0987H
dw 0, 0, 0, 0, 0 ; 五个 word 作为栈空间 (stack)
start: mov ax, ___
mov ss, ax
mov sp, ___
mov ax, 0
mov ds, ax
mov bx, 0
mov cx, 8
s: push [bx]
___________
add bx, 2
loop s
mov ax, 4c00h
int 21h
codesg ends
end start
我的做法如下: (打 * 是我加上的部分)
assume cs:codesg
codesg segment
dw 0123H, 0456H, 0789H, 0abcH, 0defh, 0fedh, 0cbah, 0987H
dw 0, 0, 0, 0, 0
start: mov ax, cs ; **
mov ss, ax ; (1)
mov sp, 1Ah ; **
mov ax, 0 ;
mov ds, ax
mov bx, 0
mov cx, 8
s: push [bx]
pop cs:[bx] ; ** (2)
add bx, 2
loop s
mov ax, 4c00h
int 21h
codesg ends
end start
我是在 windows xp 下用 masm 5.0 , 并且用 debug 来看执行结果
以下有几个问题:
1. 为什麽 stack 需要有 5 个 word, 在程式里面每一次 loop push 完就 pop
理论上只要一个 word 就可以才是
2. 在程式的一开始, 记忆体 cs:10 ~ cs:19 都是 0, 可是执行到 mov ss, ax (1)处
, cs:10 ~ cs:19 就会变 dirty, 即使 sp 依然是 001A
3. 在程式的执行过程中, 第一次执行 pop cs:[bx] (2)处 时, 会把刚刚的最後一笔资
料 0987H 盖掉, 变成 0000H (这样不就表示安全性出了问题??)
除此之外这个程式码可以达到题目的要求
不过刚刚有问题的那几点, 百思不得其解
感谢各位大大
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.243.43
1F:→ operationcow:如果有人觉得我题目或问题说的不够清楚, 我会补充@@ 05/20 21:08
2F:推 zha0:可以问那一个学校的吗 XD 05/21 09:41
3F:推 Kniveschou:112阿 IP有写 05/23 15:16