1. 程式人生 > 實用技巧 >【Prometheus專題】4. Prometheus(Alertmanager)通過webhook整合Slack或Mattermost傳送告警

【Prometheus專題】4. Prometheus(Alertmanager)通過webhook整合Slack或Mattermost傳送告警

目錄

實驗內容

實驗任務1

  使用任意文字編輯器,錄入彙編源程式task1.asm。

 1 assume cs:code, ds:data
 2 data segment
 3 db 'Nuist'
 4 db 5 dup(2)
 5 data ends
 6 code segment
 7 start:
 8 mov ax, data
 9 mov ds, ax
10 mov ax, 0b800H
11 mov es, ax
12 mov cx, 5
13 mov si, 0
14 mov di, 0f00h
15 s: mov al, [si] 
16 and al, 0dfh     //and命令,是邏輯與,將al與0dfh,即為1101 1111進行按位與操作。
17 mov es:[di], al 18 mov al, [5+si] 19 mov es:[di+1], al 20 inc si 21 add di, 2 22 loop s 23 mov ah, 4ch 24 int 21h 25 code ends 26 end start

  使用-g命令執行程式,得到下圖

出現了綠色的NUIST字樣。

將line4中的五個位元組,重新彙編,連線。

1 db 5 dup(2)
2 --> 改成:
3 db 2,3,4,5,6

執行過後得到如下圖:

可以發現,綠色的NUIST變成了彩色,可以得到猜測,dup(2)控制的是字型的顏色。

實驗任務2

  已知資料段data 中定義位元組資料如下:

1 data segments
2 db 23, 50, 66, 71, 35
3 data ends

編寫程式,在螢幕上以十進位制整數形式列印輸出這5個兩位數。

設計程式碼:

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 di,0
    mov cx,5

s1:    mov ah,0
    mov al,ds:[di]
    mov bl,
10 div bl //拆分字串 mov ds:[10+di],al mov ds:[11+di],ah mov ah,2 mov dl,ds:[10+di] add dl,30h int 21h //輸出字元 mov ah,2 mov dl,ds:[11+di] add dl,30h int 21h //輸出字元 mov ah,2 mov dl," " int 21h //輸出空格 inc di loop s1 mov ax,4c00h int 21h code ends end start

經過彙編,連線得到exe檔案,執行可以得到:

可以看到,首先使用div指令拆分字串,隨後利用地址以及int 21h命令將其輸出。

實驗任務3

教材「實驗5 編寫、除錯具有多個段的程式」(1)

程式原始碼task3.asm:

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

經過彙編、連線得到task3.exe可執行檔案,反彙編

得到程式碼:

1.檢視dw中的元素:

使用 -g 1d命令執行程式,到列印之前,得到暫存器內容如下:

2.可發現,CS = 076CH,SS = 076BH, DS = 076AH

3.設程式載入後,code段的段地址為X,則data段的段地址為X-2,stack段的段地址為X-1。

實驗任務4

實驗原始碼task4.asm:

 1 assume cs:code, ds:data, ss:stack
 2 data segment
 3   dw 0123h, 0456h
 4 data ends
 5 
 6 stack segment
 7   dw 0, 0
 8 stack ends
 9 
10 code segment
11 start:  mov ax,stack
12         mov ss, ax
13         mov sp,16
14         
15         mov ax, data
16         mov ds, ax
17         
18         push ds:[0]
19         push ds:[2]
20         pop ds:[2]
21         pop ds:[0]
22         
23         mov ax,4c00h
24         int 21h
25 
26 code ends
27 end start

經過彙編、連線後得到task4.exe可執行檔案,進行反彙編

檢視data中的資料:

發現其中資料為:1023H,0456H, 0000H, 0000H,0000H, 0000H,0000H, 0000H。

使用 -g 1d執行程式,得到 CS=076CH,SS=076BH,DS=076AH

檢視DS中的資料發現沒有改變。

因此:

1.CPU執行程式,程式返回前,data段中的資料:0123h, 0456h, 0, 0, 0, 0, 0, 0

2.CPU執行程式,程式返回前,cs=076ch,ss=076bh,ds=076ah

3.設程式載入後,code段的段地址為X,則data段的段地址為X-2,stack段的段地址為X-1。

4.對如下定義的段:

name segment
···
name ends

如果段中的資料佔 N 個位元組,不是16位元組的整數倍,則會補整,則程式載入後,

該段實際佔用的空間為:ceil(N+15)/16)*16,ceil()表示向上取整

實驗任務5

教材「實驗5 編寫、除錯具有多個段的程式」(3) 程式原始碼見task5.asm。
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

反彙編得到程式碼如下:

執行到076A:000D之前:

檢視資料段中的資料:

可以發現數據如下:0123H, 0456H, 0000H, 0000H, 0000H, 0000H, 0000H, 0000H.

執行命令,得到CS=076AH,SS=076EH,DS=076DH 

在檢視資料段中的內容,發現並沒有變化:

由上可知,

1.CPU執行程式,程式返回前,data段中的資料:0123h, 0456h, 0, 0, 0, 0, 0, 0

2.CPU執行程式,程式返回前,cs=076ah,ss=076Eh,ds=076dh

3.設程式載入後,code段的段地址為X,則data段的段地址為X+3,stack段的段地址為X-4。

實驗任務6

只有教材中實驗5的3 的程式能夠正常執行。因為如果將 end start 改為 end,那麼不指明入口,會預設從 076A:0 開始執行,

前兩個的076A:0開始的地址存放的都是資料而不是指令,因此會報錯

第三個是先儲存的指令隨後儲存的資料,因而可以執行。

實驗任務7

程式原始碼見task7.asm:
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

c segment 
  db 8 dup(0)
c ends

code segment
start:
        mov ax,a
        mov ds,ax
        mov si,0
        mov cx,9
s:      mov ax,0
        mov al,[si]
        add al,[si+16]
        mov [si+32],al
        inc si
        loop s
        mov ah,4ch
        int 21h
       
code ends
end start

經過彙編,連線得到task7.exe可執行檔案。

因為a,b,c段的長度都是16,所以就直接通過加偏移量16 32來進行訪問

使用-g 19執行,檢視a,b,c的資料,看到最後一行的資料是由前面兩行相加得到的,滿足要求。

實驗任務8

原始碼見task8.asm:

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,b
        mov ss,ax
        mov sp,10h
        mov ax,a
        mov ds,ax
        mov si,0
        mov cx,9
s:      push ds:[si]
        add si,2
        loop s
        mov ah,4ch
        int 21h
code ends
end start

反彙編後

可以發現,程式碼在001AH處呼叫int 21,使用

-g 001A命令執行程式。

從上圖中檢視的結果看出結果滿足實驗要求,實現了逆序儲存。