Tải bản đầy đủ (.pdf) (4 trang)

Ôn thi cuối kì vi điều khiển trường đại học bách khoa Đà nẵng

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (292.51 KB, 4 trang )

Chương 8
Main.s
AREA mycode,CODE,READONLY
EXPORT __main
IMPORT soNguyenTo
ALIGN
ENTRY
__main proc
LDR r5,=ketqua
mov r4,#100
loop CMP r4,#200
BGT stop
MOV r0,r4
BL soNguyenTo
cmp r0,#1
STREQ r4,[r5],#4
ADD r4,r4,#1
B loop
stop B stop
endp
AREA myData,CODE,READWRITE
Cau 2: Viet chuong trình truyen 8 đối số
Main.s
AREA mycode,CODE,READONLY
EXPORT __main
import extraargument
ALIGN
ENTRY
__main proc
mov r0,#5
mov r1,#5


mov r2,#5
mov r3,#5
mov r4,#5
push {r4}
mov r4,#6
push {r4}
mov r4,#7
push {r4}
mov r4,#8
push {r4}
BL extraargument
LDR r5,=ketqua
STR r0,[r5]
stop B stop
endp
AREA myData,CODE,READWRITE
ALIGN
ketqua DCD 10
end
cau8_2.s
AREA codene,CODE
export extraargument
align
extraargument proc
adds r0,r0,r1
adcs r0,r0,r2
adcs r0,r0,r3
pop {r4,r6,r5,r7}
adds r0,r0,r4
adcs r0,r0,r5

adcs r0,r0,r6
adc r0,r0,r7
;mov r1,#0
;loop cmp r1,#4
;BGE exit
;pop {r2}
;adcs r0,r0,r2
;add r1,r1,#1
;b loop
exit
bx lr

Câu 1: Tìm số nguyên tố từ 100 đến 200
ALIGN
ketqua DCD 0
end
soNguyento.s
AREA codene,CODE
EXPORT soNguyenTo
ALIGN
soNguyenTo PROC
;R0 so kiem tra
PUSH {LR}
CMP r0,#0x02;xet n<2
BGE Continue
B KetThuc
Continue MOVS r1,#0x02 ;r1 = i;
B CheckVongFOr
; if(n%i==0)break;
Loop SDIV r2,r0,r1

MLS r2,r1,r2,r0
CBNZ r2,LenhTiepTuc
endp
end
Cau3: dịch chuyển kí tự asci
Main.s
AREA mycode,CODE,READONLY
EXPORT __main
import shiftEncryption
ALIGN
ENTRY
__main proc
LDR r0,=ketqua
MOV r1,#1
BL shiftEncryption
stop B stop
endp
AREA myData,CODE,READWRITE
ALIGN
ketqua DCB "ABCDEF$$HIHA",0
end
cau8_3.s
AREA codene, code
export shiftEncryption
align
shiftEncryption proc
;r0 string shift encryption
;r1 offset
mov r2,#0; i = 0 -> n
loop

LDRB r3,[r0,r2];r3 = str[i]
CMP r3,#0
BEQ exit; neu '\0' exit
CMP r3,#'A'
; kiem tra thuoc trong khu
vuc ki tu
BLT continue
CMP r3,#'Z'
BLE shiftEN;
CMP r3,#'a'
BLT continue
CMP r3,#'z'
BGT continue
shiftEN
add r3,r3,r1
STRB r3,[r0,r2]
continue
add r2,r2,#1
B loop
exit bx lr
endp
end

B LenhBreak
LenhTiepTuc ADDS r1,r1,#1
CheckVongFOr mov r3,r0;,LSR#1; ADD
r3,r0,r0,LSR #31; n/2
CMP r1,r3,LSR #1
BLT Loop
LenhBreak NOP

;if(i==n/2)
ADD r3,r0,r0,LSR #31
CMP r1,r3,ASR #1
BNE KetThuc
; int result = 1;
MOVS r0,#0x01
B Thoat
KetThuc NOP
MOVS r0,#0x00
Thoat NOP
POP {LR}
BX LR
ENDP
END
cau 4: MOIVE PRICE
main.s
AREA mycode,CODE,READONLY
EXPORT __main
import moviePrice
ALIGN
ENTRY
__main proc
MOV r0,#13
BL moviePrice
LDR r1,=ketqua
STR r0,[r1]
stop B stop
endp
AREA myData,CODE,READWRITE
ALIGN

ketqua DCD 0
end

cau8_4.s
AREA codene,code
export moviePrice
align
moviePrice proc
;r0 so tuoi dau vao
;r1 gia ve dau ra
CMP r0,#12
MOVLE r0,#6
BLE exit
CMP r0,#64
MOVLE r0,#8
BLE exit
MOV r0,#7
exit bx lr
endp
end

cau 5: tính tổng calculates Sn(a) = a + aa + aaa +

main.s
AREA mycode,CODE,READONLY
EXPORT __main
import calculates
ALIGN
ENTRY
__main proc

MOV r0,#3
mov r1,#5
BL calculates


LDR r1,=ketqua
STR r0,[r1]
stop B stop
endp
AREA myData,CODE,READWRITE
ALIGN
ketqua DCD 0
end
cau8_5.s
area codene,code
export calculates
align
calculates proc
push {r3,r4,r5,lr}
mov r3,#0; tong moi so hang
mov r4,#0; tong S
CMP r1,#0;keim tra truong hop n=0
MOVEQ r0,#0
loop
cmp r1,#0; n <= 0; exit
BLE exit
mov r2,r1;r2 = n-i
mov r3,#1; tinh tich P moi so hang
loopa
cmp r2,#0; r2 == 0 break;

BLE continue
mul r3,r3,r0
sub r2,r2,#1
B loopa
continue
add r4,r4,r3
sub r1,r1,#1
B loop
exit
mov r0,r4; chuyen S -> r0
pop {r3,r4,r5,lr}
bx lr
endp
end
cau 6: Viết chương trình tính tổng giai thừa từ o > 10
AREA mycode,CODE,READONLY
EXPORT __main
ALIGN
ENTRY
__main proc
BL sum
LDR r1,=ketqua
STR r0,[r1]
stop B stop
endp
factorial proc
CMP r0,#0
MOVEQ r0,#1
BXEQ lr
mov r3,#1

loopfactorial
cmp r0,#0
BLE exitfactorial
mul r3,r3,r0
sub r0,r0,#1
B loopfactorial
exitfactorial
mov r0,r3; N! --> r0
bx lr
endp
sum proc
push {r4,r5,lr}
mov r4,#10
mov r5,#0
loopsum

cmp r4,#0
BLE exitsum
mov r0,r4
BL factorial
ADD r5,r0
sub r4,r4,#1
B loopsum
exitsum
mov r0,r5
pop {r4,r5,lr}
bx lr
endp
AREA myData,CODE,READWRITE
ALIGN

ketqua DCD 0
end
câu 7: đếm số bít 1
AREA mycode,code, readonly
export __main
align
entry
__main proc
mov r0,#10
BL countbit1
LDR r1,=ketqua
str r0,[r1]
endp
countbit1 proc
;r0 dem so bit 1
mov r1,#32; i 0-> 32
mov r2,#0 ; result
loopcount
cmp r1,#0
BLE exitcount
LSLS r0,r0, #1
adc r2,r2,#0
sub r1,r1,#1
B loopcount
exitcount
mov r0,r2
bx lr
endp

so2 DCD 0xF000000F

result DCD 2
END
Cau8_8.s
AREA sum,CODE
EXPORT countbitdiffer
ALIGN
countbitdiffer PROC
;dàu vao r0,r1
;thuc hien xor r0,r1 de tinh ra bit khac nhau
; tra ve so bit khac nhau r0
PUSH {LR}
EOR r2,r0,r1
; so bit khac nhau tuong duong so bit 1 co
trong r2
; dem so bit 1 trong r2
MOV R0,#0
MOV R1,#0
MOV r3,#32; bien i =32;
Loop
LSLS r2,r2,#1 ; dich trai
ADC r0,r0,#0

SUB r3,r3,#1 ; i = i-1
CMP r3,#0
;
BGT
Loop
POP {LR}
BX LR
ENDP

END
Câu 10: tìm hiểu về stack
AREA sum,CODE
EXPORT __main
IMPORT countbitdiffer
ALIGN
ENTRY
__main PROC

area mydata,code,readwrite
align
ketqua dcd 0
end

mov r0,#2
BL quad
b endl
sq1

cau 8 : đếm số bít khác nhau của 2 số
main.s
AREA sum,CODE
EXPORT __main
IMPORT countbitdiffer
ALIGN
ENTRY
__main PROC
LDR r0,=so1;
LDR r0,[r0]
LDR r1,=so2;

LDR r1,[r1]
BL countbitdiffer
LDR r1,=result;
STR r0,[r1]
stop B stop
ENDP
AREA myData,DATA
so1 DCD 13

push {lr}
mul r0,r0
bl sq2
pop {pc}
sq2
push {lr}
mul r0,r0
pop {pc}
quad
push {lr}
mul r0,r0
bl sq1
pop {lr}
BX lr
endl
stop B stop
ENDP
AREA myData,DATA
so1 DCD 13
so2 DCD 0xF000000F
result DCD 2

END

if i<=0


Cau 11: tính f = ……
Main.s
AREA codene,CODE,READONLY
EXPORT __main
IMPORT cal
ALIGN
ENTRY
__main PROC
mov r0,#1
mov r1,#1
BL cal
LDR r1,=result
STR r0,[r1]
stop B stop
ENDP
AREA myData,CODE,READWRITE
export const_a
export const_b
export const_c
align
const_a dcd 1
const_b dcd 2
const_c dcd 1
result DCD 223
END


Cau8_11.s
area codede,code
export cal
import const_a
import const_b
import const_c
align

LDR r1,=result
STR r0,[r1]
stop B stop
ENDP
AREA myData,CODE,READWRITE
align
result DCD 223
END

Cau8_12.s
area codene,code
export fibonacci
align
fibonacci proc
;r0 = so fibonacci thu n
CMP r0,#0
BXEQ lr
CMP r0,#1
BXEQ lr
mov r1,#1 ; i : 1-> n
mov r2,#0 ; f(n-2)

mov r3,#1 ; f(n-1)
loop
cmp r1,r0
BGT exit
add r3,r3,r2
sub r2,r3,r2
add r1,r1,#1
b loop
exit
mov r0,r3
bx lr
endp
end

cal proc
; r0 = x
; r1 = y
; r2 = ax2
; r3 = bxy
; r4 = r2 + r3 + c
push {r4,r5,lr}
LDR r2,=const_a
LDR r2,[r2]
mul r2,r2,r0
mul r2,r2,r0
LDR r3,=const_b
LDR r3,[r3]
mul r3,r3,r0
mul r3,r3,r1
LDR r4,=const_c

LDR r4,[r4]
add r4,r4,r3
add r4,r4,r2
mov r0,r4
pop {r4,r5,lr}
bx lr
endp
end
cau 12: tính số Fibonacci
main.s
AREA codene,CODE,READONLY
EXPORT __main
IMPORT fibonacci
ALIGN
ENTRY
__main PROC
mov r0,#3
BL fibonacci

cau 13: đối xứng chuỗi
main.s
AREA codene,CODE,READONLY
EXPORT __main
IMPORT palindrome
ALIGN
ENTRY
__main PROC
LDR r0,=chuoi
BL palindrome
LDR r1,=result

STR r0,[r1]
stop B stop
ENDP
AREA myData,CODE,READWRITE
align
chuoi DCB "abcdeedcba",0
result DCD 111
END

Cau8_13.s
area codene,code
export palindrome
align
palindrome proc
mov r4,r0
bl strlen; r0 <- length
sub r0,r0,#1
mov r1,#0; r1 <- 0
looppalin
LDRB r2,[r4,r0];
LDRB r3,[r4,r1];
cmp r2,r3
MOVNE r0,#0
BXNE lr
cmp r1,r0
BGT successpalin

add r1,r1,#1
sub r0,r0,#1
b looppalin

successpalin
mov r0,#1
bx lr
endp
strlen proc
;r0 string
;<-- length : r0
mov r2,#0
loop
LDRB r1,[r0],#1
cmp r1,#0
BEQ exit
add r2,r2,#1
B loop
exit
mov r0,r2
bx lr
endp
end
câu 14: viết đệ qui
main.s
AREA codene,CODE,READONLY
EXPORT __main
IMPORT recursive
ALIGN
ENTRY
__main PROC
mov r0,#2
mov r1,#3
BL recursive

LDR r1,=result
STR r0,[r1]
stop B stop
ENDP
AREA myData,CODE,READWRITE
align
result DCD 111
END
Cau8_14.s
area codene,code
export recursive
align
recursive proc
;tinh n^k
; n -> r0
; k-> r1
push {lr}
cmp r1,#0
MOVEQ r0,#1
POPEQ {pc}
push {r4}
mov r4,r0
sub r1,r1,#1
bl recursive
mul r0,r0,r4
pop {r4}
pop {pc}
endp
end



Chương 10
Câu 1: xóa một kí tự trong chuối
Main.c
char str1[50] = "abc xyz abc chao den voi
assembly";
char charRemove = 'a';
extern void removeChar(char *s,char c);
int main(void){
//xoa mot ki tu ra khoi chuoi
removeChar(str1,charRemove);
return 0;
}
Removecharr.s
AREA substring,CODE
EXPORT removeChar
ALIGN
removeChar PROC
;r0 str[0]
;r1 char
;bao ton gia tri
PUSH {r4,lr}
mov r2,#0
loopend LDRB r2,[r0],#1; r2 = str1[i]; i++;
CMP r2,#'\0'
;
BEQ endloop
CMP r2,r1
BNE loopend
mov r3,r0

;j=i
swap LDRB r4,[r3],#-1;r4,str[j]; j--;
STRB r4,[r3],#2
;str1[j] =
r4; j+=2;
CMP r4,#'\0'
bne swap
B loopend
endloop POP {r4,lr}
BX LR
ENDP
Cau 2: nối chuối
Main.s
AREA mycode,CODE,READONLY
EXPORT __main
IMPORT strcat
ALIGN
ENTRY
__main proc
LDR r0,=chuoi
LDR r1,=chuoi1
BL strcat
stop B stop
endp
AREA myData,CODE,READWRITE
ALIGN
diachi DCD 0
chuoi DCB "noi chuoi nay",0
chuoi1 DCB ", voi chuoi nay",0
end

strcat.c
void strcat(char *dst,char *src){
while(*dst) dst++;
while(*dst++ = *src++);
}
Cau 4 tim kí tự trong chuỗi
Main.s
AREA mycode,CODE,READONLY
EXPORT __main
IMPORT search

ALIGN
ENTRY
__main proc
LDR r0,=chuoi
mov r1,#'a'
BL search
ldr r1,=ketqua
str r0,[r1]
stop B stop
endp
AREA myData,CODE,READWRITE
ALIGN
chuoi DCB "noi chuoi nay",0
ketqua dcd 0
end
searchChar.c
char* search (char *s,char c){
char *p;
for(;*s;s++){

if(*s == c) p=s;
}
return p;
}
Cau 5: tính tổng score của students
Main.c
int total = 0;
struct Student_T{
char c1;
char c2;
int score;
char c3;
} students[10];
extern int totalScore();
int main(void){
//xoa mot ki tu ra khoi chuoi
int i =0;
for(;i<10;i++){
students[i].c1 = 'a';
students[i].c2 = 'b';
students[i].c3 = 'c';
students[i].score = i;
}
total = totalScore();
return 0;
}
totalScore.s
area condene,code
import students
export totalScore

align
totalScore proc
push {lr}
LDR r0,=students; r0 = students[0]
mov r1,#0; r1 = totalScore
mov r2,#0; r2 = i:0-> 10
add r0,r0,#4;r0 => students[i].score
loop
cmp r2,#10
BGE exit
;doc gia tri bo nho tai students[i].score
LDR r3,[r0],#12
add r1,r1,r3
add r2,r2,#1
B loop
exit
mov r0,r1
pop {lr}
bx lr
endp
end
câu 6: tính max của 4 số
main.c
int ketqua = 0;
int so1 = 11;

int so2 = 22;
int so3 = 33;
int so4 = 44;
extern int max4(int a,int b,int c,int d);

int main(void){
//xoa mot ki tu ra khoi chuoi
ketqua = max4(so1,so2,so3,so4);
return 0;
}
Max4so.s
area codene,code
export max4
align
max4 proc
;r0-r3 -> so1 - so4
;return max -> r0
push {r4,lr}
mov r4,r0
cmp r4,r1
MOVLT r4,r1
cmp r4,r2
MOVLT r4,r2
cmp r4,r3
MOVLT r4,r3
mov r0,r4
pop {r4,lr}
bx lr
endp
end
Cau 10_& số đối xứng
Main.c
int ketqua = 0;
int so = 123321;
extern int checks(int a);

int main(void){
//xoa mot ki tu ra khoi chuoi
ketqua = checks(so);
return 0;
}
Cau10_7.s
area codene,code
export checks
align
checks proc
;r0 -> number
;return r0 = 1(true) | 0(false)
push {lr,r4,r5}
mov r4,r0
mov r5,#0
MOV r2,#10

; sum = 0;

isPal
CBZ r4,done
SDIV r1,r4,r2
;r1 = n/10
MLS r3,r1,r2,r4 ;r3 = n - r1*10
mov r1,r5
;r1 = sum
add r1,r1,r1,LSL #2
;r1 = 5*sum
add r1,r3,r1,LSL #1
;sum = sum * 10

+r
mov r5,r1
mov r2,#10
SDIV r4,r4,r2
BL isPal
done
MOV r1,r5
CMP r1,r0
BNE no
yes
MOV r0,#1
B exit
no
mov r0,#0
exit pop {lr,r4,r5}
bx lr
endp
end

;save sum
;r0 = n/10



×