(一)編程,向內存 0:200 ~ 0:23F 依次傳送數據 0 ~ 63,程序中只能使用 9 條指令,9 條指令包括 mov ax,4c00H 和 int 21H。編程
思路:oop
assume cs:code code segment mov ax,0020h mov ds,ax mov bx,0h mov cx,64 s: mov [bx],bl inc bx loop s
mov ax,4c00h int 21h code ends end
這題有兩個要注意的地方:spa
(二)下面的程序的功能是將 mov ax,4c00H 以前的指令複製到內存 0:200(0020:0) 處,上機調試,跟蹤程序運行結果。調試
assume cs:code code segment mov ax , ( ) ; ax 裏面應該存放的是指令的首地址的段地址 mov ds , ax mov ax , 0020h
mov es , ax mov bx , 0 mov cx , ( ) ; cx 裏存放的是總共要複製的字節數 s: mov al , [ bx ] mov es: [ bx ] , al inc bx loop s mov ax , 4c00h int 21h code ends end
爲了完成這道題, 須要解決下面 3 個問題:code
很顯然,須要複製的是內存中的字節,複製方向是從內存到內存。可是須要先將數據傳入寄存器中做爲中轉。從上面的程序能夠知道,這個中轉寄存器是 AL。blog
至於有多少個字節,能夠先將第二個空隨便添上一個數,程序加載如內存後,查看 CX 寄存器中的值,則是程序的總字節數,再減去最後兩條指令的字節數。內存
因爲是要複製當前程序,因此確定得知道當前程序被加載如內存後的地址,CS 段寄存器中存儲的是指向程序代碼段的段地址,故將 CS 寄存器中的指向代碼的段地址賦值給 DS(經過 AX 中轉)。class
[ bx ] 做爲偏移地址爲 BX 的內存單元,它支持的段地址默認是存儲在 DS 段寄存器中的。變量
本例中 ds:[bx] 指向的是存儲代碼段的內存單元(源內存段)。因爲 DS 被佔用了,因此目標內存單元的段地址就沒有存儲的段寄存器了,這時可使用 ES 寄存器。若是一樣使用 [bx] 偏移地址的話,必須明確的指出它的前綴,故es:[bx]就指向了內存是0200H的內存單元地址段。程序
綜上,完成的程序應該爲以下:
assume cs:code code segment mov ax , cs mov ds , ax mov ax , 0020h mov es , ax mov bx , 0 mov cx , 23 s: mov al , [ bx ] ; 不寫段地址默認的是 ds mov es: [ bx ] , al inc bx loop s mov ax , 4c00h int 21h code ends end