彙編語言實驗四

(一)編程,向內存 0:200 ~ 0:23F 依次傳送數據 0 ~ 63,程序中只能使用 9 條指令,9 條指令包括 mov ax,4c00H 和 int 21H。編程

 思路:oop

  • 這題有兩個變量,一個是內存地址,另外一個是須要向內存地址傳入的數據。
  • 存放數據的內存地址還能夠當作是 0020:0 ~ 0020:3FH
  • 訪問內存的段地址是 0000H,這個地址能夠存儲在 DS 中。地址偏移量的變化能夠存儲在 BX 中
  • 數據和內存地址的變化次數都是 64。
  • loop 的次數存放在 CX 中,大小爲 64。
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

  • 爲了達到題目的要求(最多隻能使用 9 條指令),因此使用了內存地址了另外一種等價形式,這樣能夠減小寄存器的使用。
  • 因爲是將寄存器中的數送入內存,因此只能使用 BX 寄存器的低八位 BL 來向內存傳送數據,不然會形成位數不匹配的後果。

(二)下面的程序的功能是將 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
相關文章
相關標籤/搜索