組合語言實驗四

2022-03-21 03:51:15 字數 1763 閱讀 6743

(一)程式設計,向記憶體 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...