(一)程式設計,向記憶體 0:200 ~ 0:23f 依次傳送資料 0 ~ 63,程式中只能使用 9 條指令,9 條指令包括 mov ax,4c00h 和 int 21h。
思路:
assume cs:code
code segment
movax,0020h
movds,ax
movbx,0h
mov cx,64
s: mov
[bx],bl
incbx
loop s
movax,4c00h
int21h
code ends
end
這題有兩個要注意的地方:
(二)下面的程式的功能是將 mov ax,4c00h 之前的指令複製到記憶體 0:200(0020:0) 處,上機除錯,跟蹤程式執行結果。
assume cs:code
code segment
movax , ( ) ; ax 裡面應該存放的是指令的首位址的段位址
movds , ax
movax , 0020h
mov es , ax
mov bx , 0
movcx , ( ) ; cx 裡存放的是總共要複製的位元組數
s:mov
al , [ bx ]
moves:
[ bx ] , al
incbx
loop s
movax , 4c00h
int21h
code ends
end
為了完成這道題, 需要解決下面 3 個問題:
很顯然,需要複製的是記憶體中的位元組,複製方向是從記憶體到記憶體。但是需要先將資料傳入暫存器中作為中轉。從上面的程式可以知道,這個中轉暫存器是 al。
至於有多少個位元組,可以先將第二個空隨便添上乙個數,程式載入如記憶體後,檢視 cx 暫存器中的值,則是程式的總位元組數,再減去最後兩條指令的位元組數。
由於是要複製當前程式,所以肯定得知道當前程式被載入如記憶體後的位址,cs 段暫存器中儲存的是指向程式**段的段位址,故將 cs 暫存器中的指向**的段位址賦值給 ds(通過 ax 中轉)。
[ bx ] 作為偏移位址為 bx 的記憶體單元,它支援的段位址預設是儲存在 ds 段暫存器中的。
本例中 ds:[bx] 指向的是儲存**段的記憶體單元(源記憶體段)。由於 ds 被占用了,所以目標記憶體單元的段位址就沒有儲存的段暫存器了,這時可以使用 es 暫存器。如果同樣使用 [bx] 偏移位址的話,必須明確的指出它的字首,故es:[bx]就指向了記憶體是0200h的記憶體單元位址段。
綜上,完成的程式應該為如下:
assume cs:code
code segment
movax , cs
movds , ax
movax , 0020h
moves , ax
mov bx , 0
movcx , 23
s:mov
al , [ bx ] ; 不寫段位址預設的是 ds
moves:
[ bx ] , al
incbx
loop s
movax , 4c00h
int21h
code ends
end
《組合語言》實驗 實驗
注意 db定義位元組型別變數,乙個位元組資料百佔1個位元組單度元,讀完乙個,偏移量加1 dw定義字型別變問量,乙個字資料佔2個位元組單元,讀完乙個,權偏移量加2 dd定義雙字型別變數版,乙個雙字資料佔4個位元組單元,讀完乙個,權偏移量加4 一開始用了乙個暫存器表示所有項,但是後來發現四個資料佔的位元...
組合語言實驗1 2
小寫字母變為大寫字母 data segment notic db please input the word 0ah,0dh data ends code segment assume cs code,ds data start mov ax,data mov ds,ax 填入ds mov cx,1...
組合語言實驗1 3
輸入10個字元,並反序輸出 data segment dd1 db 10 dup data ends code segment assume cs code,ds data start mov ax,data mov ds,ax lea bx,dd1 dd1的有效位址放入bx中 mov cx,0ah...