[問題] 新手發問 masm 的 assembly
小弟我是新手, 目前正在看大陸 王爽 的 "彙編語言"
裡面有一題習題, 我做了以後有點疑義
來這邊請教各位大大
題目如下
下面的程序實現依次用內存 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
→
05/20 21:08, , 1F
05/20 21:08, 1F
推
05/21 09:41, , 2F
05/21 09:41, 2F
推
05/23 15:16, , 3F
05/23 15:16, 3F
ASM 近期熱門文章
PTT數位生活區 即時熱門文章