彙編語言程序設計實驗一:順序結構
第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