1. 程式人生 > 實用技巧 >ServerLess之雲函式實踐-天氣API

ServerLess之雲函式實踐-天氣API

實驗任務1

原始碼:

assume cs:code, ds:data
data segment
        db 'Nuist'
        db 5 dup(2)
data ends

code segment
start:
        mov ax, data
        mov ds, ax

        mov ax, 0b800H
        mov es, ax

        mov cx, 5
        mov si, 0
        mov di, 0f00h
s:      mov al, [si]
        and al, 0dfh
        mov es:[di], al
        mov al, [5+si]
        mov es:[di+1], al
        inc si
        add di, 2
        loop s

        mov ah, 4ch
        int 21h
code ends
end start

執行結果截圖:

在debug裡除錯到程式返回前的截圖:

修改資料後截圖:

猜測這裡的數值的作用是更改字元的顏色。

實驗任務2

原始碼:

assume cs:code, ds:data
data segment
    db 23,50,66,71,35
data ends

code segment
start:
    mov ax,data
    mov ds,ax

    mov cx,5
    mov si,0

s:    mov bl,10
    mov al,ds:[si]
    mov ah,0
    div bl

    add al,30h
    add ah,30h
    mov ds:[si
+5],al mov ds:[si+6],ah mov ah, 2 mov dl,ds:[si+5] int 21h mov ah, 2 mov dl,ds:[si+6] int 21h mov ah, 2 mov dl, 32 int 21h inc si loop s mov ah,4ch int 21h code ends end start

執行結果:

實驗任務3

原始碼:

assume cs:code, ds:data, ss:stack
data segment
  dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
data ends

stack segment
  dw 
0, 0, 0, 0, 0, 0, 0, 0 stack ends code segment start: mov ax,stack mov ss, ax mov sp,16 mov ax, data mov ds, ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends end start

1)

  返回程式前data中資料:

  0123h 0456h 0789h 0ABCh 0DEFh 0FEDh 0CBAh 0987h

2)

  cs=076Ch、ss=076Bh、ds=076A

反彙編:

3)

data段地址為X-2、stack段地址為X-1

實驗任務4

原始碼:

assume cs:code, ds:data, ss:stack
data segment
  dw 0123h, 0456h
data ends

stack segment
  dw 0, 0
stack ends

code segment
start:  mov ax,stack
        mov ss, ax
        mov sp,16
        
        mov ax, data
        mov ds, ax
        
        push ds:[0]
        push ds:[2]
        pop ds:[2]
        pop ds:[0]
        
        mov ax,4c00h
        int 21h

code ends
end start

1)

  0123h、0456h

2)

  cs:076Ch ss=076Bh ds=076Ah

3)

  data段地址為X-2 stack段地址為X-1

4)

  會佔有最接近且不超過16的倍數個位元組。

實驗任務5

原始碼:

assume cs:code, ds:data, ss:stack

code segment
start:  mov ax,stack
        mov ss, ax
        mov sp,16
        
        mov ax, data
        mov ds, ax
        
        push ds:[0]
        push ds:[2]
        pop ds:[2]
        pop ds:[0]
        
        mov ax,4c00h
        int 21h

code ends
data segment
  dw 0123h, 0456h
data ends

stack segment
  dw 0,0
stack ends
end start

1)

  0123h、0456h

2)

  cs:076Ah ss=076Eh ds=076Dh

3)

  data段地址為X+3 stack段地址為X+4

實驗任務6

  第三個可以正常執行。因為如果不指明程式的入口,將會從第一條指令順序向後執行,前兩個都會將data段和stack段中的資料當作指令來執行,而第三個的data段和stack段位於指令程式碼段的後面不影響程式的正常執行。

實驗任務7

原始碼:

assume cs:code
a segment
  db 1,2,3,4,5,6,7,8
a ends

b segment
  db 1,2,3,4,5,6,7,8
b ends

c1 segment   
  db 8 dup(0)
c1 ends

code segment
start:
           mov ax,a
    mov ds,ax
    mov ax,b
    mov es,ax
    mov ax,c1
    mov ss,ax

    mov cx,8
    mov si,0

s:    mov ax,ds:[si]
    mov ss:[si],ax
    mov ax,es:[si]
    add ss:[si],ax
    inc si
    loop s
    
    mov ax,4c00h
    int 21h
code ends
end start

實驗任務8

原始碼:

assume cs:code
a segment
  dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
a ends

b segment
  dw 8 dup(0)
b ends

code segment
start: 
           mov ax,a
    mov ds,ax
    mov ax,b
    mov ss,ax
    mov sp,16
    mov si,0
    mov cx,8

s:    push ds:[si]
    add si,2
    loop s

    mov ax,4c00h
    int 21h
code ends
end start

實驗總結

1.通過本次實驗我掌握了大小寫字元的轉換方法、數字字元和數值之間的轉換方法,同時也學到了利用系統功能呼叫int 21h中的2號子功能輸出單個字元。

2.掌握了含有多個數據段和指令段的空間分配和準確定址問題。

3.學會了對不同段進行數值操作,主要是利用暫存器和利用棧。

4.掌握了每個段的空間實際佔用問題。

5.認識到了指明程式入口的重要性。