edu彙編語言——實訓課程

彙編語言程序設計實驗一:順序結構

第1關:加法、減法運算

任務描述
本關任務:編寫一個能進行加、減運算的小程序。

編程要求
在寄存器AX,BX,CX,DX中分別存放了四個變量A,B,C,D的值,均爲8位無符號數。

請編寫彙編代碼,計算Z=(A+B)-(C-D)的結果,並將結果ZZ保存到AX中。

輸入數據由評測系統讀取,並存放到指定寄存器中,程序運行結果也由評測系統讀取並輸出,學員只需要實現任務邏輯即可。

測試說明
平臺會對你編寫的代碼進行測試:

測試輸入:30201005
預期輸出:0045

測試輸入:F00F0001
預期輸出:0100

測試輸入的每兩個字符組成一個十六進制數,分別對應要讀取到AX,BX,CX,DX的值。
Cal:
    ;在此處編寫彙編代碼實現功能
    add ax,bx
    sub cx,dx
    sub ax,cx
    ret
    

第2關:混合四則運算

任務描述
本關任務:編寫一個能進行混合四則運算的小程序。

編程要求
在寄存器AX,BX,CX,DX中分別存放了四個變量X,Y,V,ZX,Y,V,Z的值,均爲16位有符號數。此外,還有一個寄存器RSI保存有變量W的地址。

請編寫彙編代碼,計算W=(X * Y-V)/ZW=(X∗Y−V)/Z的結果,並將商保存到W位置處,將餘數保存到W+2位置處。

注意1:算式中的乘法運算不會超出16位表示範圍,減法運算不會得到負數結果。

注意2:由於使用的是不同於8086的X86-64彙編,因此內存尋址不再使用段址:偏移地址的形式,而是直接使用完整地址,比如:

mov ax,0xff
mov word ds:[si], ax ;不再使用這種形式
mov word [rsi], ax ;直接使用完整地址
上述代碼中的rsi爲64位寄存器,si可以看作是它的低16位,就像ax和al的關係。

輸入數據由評測系統讀取,並存放到指定寄存器中,程序運行結果也由評測系統讀取並輸出,學員只需要實現任務邏輯即可。

測試說明
平臺會對你編寫的代碼進行測試:

測試輸入:0050002000100015
預期輸出:00790003

測試輸入:0098003200560132
預期輸出:001800AA

測試輸入每四個字符代表一個十六進制數,分別對應要讀取到AX,BX,CX,DX的值。

預期輸出的前四個字符代表商的十六進制表示,後四個字符代表餘數的十六進制表示。
    Cal:
        push dx
        imul bx
        sub ax, cx
        pop cx
        idiv cx
        mov word [rsi], ax
        mov word [rsi + 2], dx
        ret

彙編語言程序設計實驗二:分支結構

第1關:求最大值

任務描述
本關任務:編寫一個能求出三個數中最大值的小程序。

編程要求
在寄存器AX,BX,CX中存有三個16位有符號數,找出其中最大的數,並將其放在AX中。

輸入數據由評測系統讀取,並存放到指定寄存器中,程序運行結果也由評測系統讀取並輸出,學員只需要實現任務邏輯即可。

測試說明
平臺會對你編寫的代碼進行測試:

測試輸入:FF0000010020;
預期輸出:
0020

測試輸入:123456789ABC;
預期輸出:
5678

測試輸入的每四個字符組成一個十六進制數,分別對應要讀取到AX,BX,CX的值。
    Max:
        cmp ax, bx
        jg g1
        mov dx, bx
        mov bx, ax
        mov ax, dx
    g1:
        cmp ax, cx
        jg g2
        mov dx, cx
        mov cx, ax
        mov ax, dx
    g2:
        ret


第2關:判斷變量符號

任務描述
本關任務:編寫一個能判斷變量符號的小程序。

編程要求
根據XX計算YY的值,當X < 0X<0時Y = -1Y=−1;X = 0X=0時Y = 0Y=0;X > 0X>0時Y = 1Y=1。

請定義一個數據段,並在其中分別定義兩個名爲X和Y的字節型變量,長度爲1個字節。

評測系統會讀取輸入數據,並將其放入X,然後調用學員編寫的代碼,最後讀取並顯示Y中的數據。所以學員代碼需要將上面運算的結果存入Y中。

注意:平臺使用的是Nasm,定義數據段的語法與Masm有所不同,它使用的是section .data來定義:

section .data ;定義數據段
    var1 db 0,0 ;字節型,總長爲2個字節
    var2 dw 0,0,0 ;字型,總長爲2*3=6個字節
section .text ;定義代碼段
Prog1:
    mov rsi, var1 ;將var1變量的地址存入rsi
    mov ax, 0xff
    mov word [rsi], ax ;向var1變量寫入ax的值
測試說明
平臺會對你編寫的代碼進行測試:

測試輸入:F0;
預期輸出:
FF

測試輸入:00;
預期輸出:
00
section .data
    Y db 0
    X db 0

Sign:
    mov al, byte [X]
    cmp al, 0
    jg g0
    je e0

    mov al, -1
    mov byte [Y], al
    ret
e0:
    mov al, 0
    mov byte [Y], al
    ret

g0:
    mov al, 1
    mov byte [Y], al
    ret

彙編語言程序設計實驗三:循環結構

第1關:求最高成績

任務描述
本關任務:編寫一個能求出多個成績中最高成績的小程序。

編程要求
在寄存器RSI中存放了一個字節型數組的地址,數組中存放有多個成績數據,均爲正數。在寄存器AX中則存有這個數組的長度。

請編寫代碼,求出這個數組中的最高成績,並將其放入到AX中。

注意:數組的最小長度爲1,最大爲20。

輸入數據由評測系統讀取,並存放到指定寄存器中,程序運行結果也由評測系統讀取並輸出,學員只需要實現任務邏輯即可。

測試說明
平臺會對你編寫的代碼進行測試:

測試輸入:021030
預期輸出:30

測試輸入:0450346010
預期輸出:60

測試輸入的前兩個字符是數組的長度的十六進制表示,之後每兩個字符組成一個十六進制數,代表數組中的值。
Max:
    mov cx, ax
    mov al, byte [rsi]
find:
    mov ah, byte [rsi]
    cmp al, ah
    jg g
    mov al, ah
g:
    inc rsi
    loop find
    ret

第2關:統計奇偶數量

任務描述
本關任務:編寫一個能統計數組中奇數偶數數量的小程序。
編程要求
在寄存器RSI中存放了一個字節型數組的地址,數組中存放有多個數據,均爲非負數。在寄存器AX中則存有這個數組的長度。
請編寫代碼,在數據段中定義一個字節型變量Result,長度爲2個字節,然後統計這個數組中的奇數和偶數的數量,將偶數數量放入變量第一個字節,奇數數量放入變量第二個字節。
輸入數據由評測系統讀取,並存放到指定寄存器中,程序運行結果也由評測系統讀取並輸出,學員只需要實現任務邏輯即可。
測試說明
平臺會對你編寫的代碼進行測試:
測試輸入:03000204
預期輸出:0300
測試輸入:020102
預期輸出:0101
測試輸入的前兩個字符是數組的長度的十六進制表示,之後每兩個字符組成一個十六進制數,代表數組中的值。
section .data
    Result db 0,0


Count:
    mov cx, ax
tes:
    mov al, byte [rsi]
    and al, 0x01
    mov rdi, Result
    jz even
    inc rdi
even:
    mov ah, byte [rdi]
    inc ah
    mov byte [rdi], ah
    inc rsi
    loop tes
    ret

彙編語言程序設計實驗四:綜合

第1關:字符大小寫轉換

測試說明

任務描述
本關任務:編寫一個能將字符串中字母大小寫轉換的小程序。
編程要求
在寄存器RSI中存放有一個以符號$結尾的字符串的地址,請編寫代碼,將這個字符串中的小寫字母轉化爲大寫,大寫字母轉化爲小寫,其他字符不做處理。
輸入數據由評測系統讀取,並存放到指定寄存器中,程序運行結果也由評測系統讀取並輸出,學員只需要實現任務邏輯即可。
測試說明
平臺會對你編寫的代碼進行測試:
測試輸入:04Abc$
預期輸出:aBC$
測試輸入:08iPhone8$
預期輸出:IpHONE8$
輸入數據的前兩個字符是字符串長度的十六進制表示,之後則是字符串的內容。
Conv:
    mov al, byte [rsi]
    cmp al, '$'
    je end

    cmp al,'a'
    jl up
    cmp al,'z'
    jg loopEnd
    and al, 0xDF ;小寫變大寫,就是將二進制表示的第6位變成0
    mov byte [rsi], al
    jmp loopEnd
up:
    cmp al, 'A'
    jl loopEnd
    cmp al, 'Z'
    jg loopEnd
    or al, 0x20 ;大寫變小寫,就是將二進制表示的第6位變成1
    mov byte [rsi], al

loopEnd:
    inc rsi
    jmp Conv

end:
    ret

第2關:統計字符數量

任務描述
本關任務:編寫一個能統計字符串中各種字符數量的小程序。

編程要求
在寄存器RSI中存放有一個以符號$結尾的字符串的地址,請在數據段中定義一個字節型變量Result,長度爲3個字節。

然後統計這個字符串中數字,字母,其他字符(即除數字、字母外的)的數量,並將結果依次存放到Result的三個字節中。

注意:字符串末尾的$不算在內。

輸入數據由評測系統讀取,並存放到指定寄存器中,程序運行結果也由評測系統讀取並輸出,學員只需要實現任務邏輯即可。

測試說明
平臺會對你編寫的代碼進行測試:

測試輸入:041AC$
預期輸出:010200

測試輸入:0EHello World!$
預期輸出:000A02

輸入數據的前兩個字符是字符串長度的十六進制表示,之後則是字符串的內容。

預期輸出每兩個字符組成一個十六進制數,分別代表Result變量的三個字節的內容。
    section .data
        Result db 0,0,0
    Count:
        ;在ascii表中,小寫字母>大寫字母>數字
        mov al, byte [rsi]
        cmp al, '$'
        je end
        ;判斷是不是小寫字母
        cmp al,'z'
        jg other
        cmp al, 'a'
        jl up
        mov ah, byte [Result + 1]
        inc ah
        mov byte [Result + 1],ah
        jmp loopEnd
    up:
        ;判斷是不是大寫字母
        cmp al,'Z'
        jg other
        cmp al,'A'
        jl dig
        mov ah, byte [Result + 1]
        inc ah
        mov byte [Result + 1],ah
        jmp loopEnd
    dig:
        ;判斷是不是數字
        cmp al,'9'
        jg other
        cmp al,'0'
        jl other
        mov ah, byte [Result ]
        inc ah
        mov byte [Result],ah
        jmp loopEnd
    other:
        ;否則是其他符號
        mov ah, byte [Result + 2]
        inc ah
        mov byte [Result + 2],ah
    loopEnd:
        inc rsi
        jmp Count
    end:
        ret


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章