JAXBContext版本衝突java.lang.TypeNotPresentException: Type javax.xml.bind.JAXBContext not present at
一、實驗結論
實驗過程中使用到的碟符註明為v。
實驗一:
實驗任務(1):教材「實驗9 根據材料程式設計」(P187-189) 程式設計:在螢幕中間分別顯示綠色、綠底紅色、白底藍色的字串'welcome to masm!'。
assume cs:code,ds:data data segment db 'Welcome to masm!' db 02h,24h,71h data ends code segment start: mov bx,0b800h mov es,bx mov bx,data mov ds,bx mov cx,16 mov di,0 mov si,1824 s1:mov bx,ds:[16] mov es:[si],al add di,1 mov bx,ds:[di] mov es:[si],al add si,1 add si,1 loop s1 mov cx,16 mov si,1984 mov di,0 s2: mov bx,ds:[17] mov es:[si],al add di,1 mov bx,ds:[di] mov es:[si],al add si,1 add si,1 loop s2 mov cx,16 mov si,2144 mov di,0 s3:mov bx,ds:[18] mov es:[si],al add di,1 mov bx,ds:[di] mov es:[si],al add si,1 add si,1 loop s3 mov ah,4ch int 21h code ends end start
編譯連線
執行
實驗任務(2):編寫子程式printStr,實現以指定顏色在螢幕上輸出字串。呼叫它,完成字串輸出。錄入編譯源程式task2.asm
assume cs:code, ds:data data segment str db 'try', 0 data ends code segment start: mov ax, data mov ds, ax mov si, offset str mov al, 2 call printStr mov ah, 4ch int 21h printStr: push bx push cx push si push di mov bx, 0b800H mov es, bx mov di, 0 s: mov cl, [si] mov ch, 0 jcxz over mov ch, al mov es:[di], cx inc si add di, 2 jmp s over: pop di pop si pop cx pop bx ret code ends end start
編譯連線
執行結果
對源程式做如下修改:
把line3改為:
str db 'another try', 0
把line12改為:
mov al, 4
再次彙編、執行程式,觀察執行結果。
基於執行結果,理解原始碼,以及,組合使用轉移指令call和ret實現子程式的原理與方法。具體地,在line18-40中:
line19-22, line36-39,這組對稱使用的push、pop,這樣用的目的是什麼?
用棧儲存子程式執行之前的暫存器,子程式執行結束後,讓程式能夠繼續執行。這樣的保護恢復能更好利用暫存器。
line30的功能是什麼?
將cx暫存器中的字元顏色和字型轉移到es暫存器和di暫存器指示的視訊記憶體地址中。
實驗任務(3):使用任意文字編輯器,錄入彙編程式task3.asm
assume cs:code, ds:data data segment x dw 1984 str db 16 dup(0) data ends code segment start: mov ax, data mov ds, ax mov ax, x mov di, offset str call num2str mov ah, 4ch int 21h num2str: push ax push bx push cx push dx mov cx, 0 mov bl, 10 s1: div bl inc cx mov dl, ah push dx mov ah, 0 cmp al, 0 jne s1 s2: pop dx or dl, 30h mov [di], dl inc di loop s2 pop dx pop cx pop bx pop ax ret code ends end start
編譯連線
執行debug
使用-u命令進行反彙編
使用-g命令執行到程式的退出之前,也就是line15之前
使用-d命令檢視記憶體內容
轉換後的數字字串1984成功被放入了str標號之後的記憶體單元
修改後重新彙編連線
assume cs:code, ds:data data segment x dw 1984 str db 16 dup(0) data ends code segment start: mov ax, data mov ds, ax mov ax, x mov di, offset str call num2str mov si, offset str mov al, 2 call printStr mov ah, 4ch int 21h num2str: push ax push bx push cx push dx mov cx, 0 mov bl, 10 s1: div bl inc cx mov dl, ah push dx mov ah, 0 cmp al, 0 jne s1 s2: pop dx or dl, 30h mov [di], dl inc di loop s2 pop dx pop cx pop bx pop ax ret printStr: push bx push cx push si push di mov bx, 0b800H mov es, bx mov di, 0 s: mov cl, [si] mov ch, 0 jcxz over mov ch, al mov es:[di], cx inc si add di, 2 jmp s over: pop di pop si pop cx pop bx ret code ends end start
執行結果
更改line3中整數為任意數值更改為2077
實驗任務(4):使用任意文字編輯器,錄入彙編源程式task4.asm。
assume cs:code, ds:data data segment str db 80 dup(?) data ends code segment start: mov ax, data mov ds, ax mov si, 0 s1: mov ah, 1 int 21h mov [si], al cmp al, '#' je next inc si jmp s1 next: mov cx, si mov si, 0 s2: mov ah, 2 mov dl, [si] int 21h inc si loop s2 mov ah, 4ch int 21h code ends end start
編譯連線
執行功能是把輸入的以#結尾的字串再列印一遍
結合執行結果,理解程式功能,瞭解軟中斷指令。具體地:
line12-19實現的功能是?
功能是迴圈讀入字串,在輸入檢測到#的時候跳出執行子程式,向next段執行
line21-27實現的功能是?
將複製的資料段輸出到螢幕對應記憶體上
實驗任務(5):在visual studio整合環境中,編寫一個簡單的包含有函式呼叫的c程式。程式碼如下:
#include<stdio.h> int sum(int,int); int main(){ int a = 2, b = 7 , c; c = sum(a,b); return 0; } int sum(int x, int y){ return (x + y); }
在line7, line13分別設定斷點,在除錯模式下,檢視反彙編程式碼。
設定斷點:
反彙編
--- c:\users\red\documents\visual studio 2012\projects\project1\project1\源.cpp - #include<stdio.h> int sum(int,int); int main(){ 009C1410 push ebp 009C1411 mov ebp,esp 009C1413 sub esp,0E4h 009C1419 push ebx 009C141A push esi 009C141B push edi 009C141C lea edi,[ebp-0E4h] 009C1422 mov ecx,39h 009C1427 mov eax,0CCCCCCCCh 009C142C rep stos dword ptr es:[edi] int a = 2, b = 7 , c; 009C142E mov dword ptr [a],2 009C1435 mov dword ptr [b],7 c = sum(a,b); 009C143C mov eax,dword ptr [b] 009C143F push eax 009C1440 mov ecx,dword ptr [a] 009C1443 push ecx 009C1444 call sum (09C105Fh) 009C1449 add esp,8 009C144C mov dword ptr [c],eax return 0; 009C144F xor eax,eax } 009C1451 pop edi } 009C1452 pop esi 009C1453 pop ebx 009C1454 add esp,0E4h 009C145A cmp ebp,esp 009C145C call __RTC_CheckEsp (09C113Bh) 009C1461 mov esp,ebp 009C1463 pop ebp 009C1464 ret
分析反彙編程式碼,從彙編的角度,觀察高階語言中引數傳遞和返回值是通過什麼實現的,以及,引數入棧順序,返回值的帶回方式,等等:
原理:高階語言中的形參列表是從右往左進行壓棧的,接下來利用call函式呼叫子程式。當進行函式呼叫的時候,引數從右到左進入暫存器,call命令呼叫返回函式內部。進行運算後返回,暫存器的運算值回到儲存值得暫存器中完成了一次完整的函式執行。
二、實驗總結:
1、學習瞭如何在螢幕不同位置顯示字元。
2、瞭解學習了跳轉指令
3、在高階語言反彙編學習中,初步瞭解了彙編連線的原理。