Bài tập

Tổng hợp các bài tập Assembly có lời giải chỉ cần copy là chạy

Huy Erick

Ngôn ngữ Assembly đang là một trong những ngôn ngữ gây ra nhiều sự ức chế vì nó cũng không khác gì các ngôn ngữ lập trình khác như C, C++, Visual Basic, C#... Chỉ...

Ngôn ngữ Assembly đang là một trong những ngôn ngữ gây ra nhiều sự ức chế vì nó cũng không khác gì các ngôn ngữ lập trình khác như C, c+ +, Visual Basic, C#... Chỉ cần thiếu 1 dấu chấm hay dấu phẩy thì chương trình cũng không thể chạy được.

Hầu hết các bài tập Assembly đều rất khó tìm bởi đa phần những người giải được ít khi chia sẻ trên các trang mạng, chúng ta cần phải tự mày mò và tìm ra phương pháp giải hay tham khảo một số bài tập tương tự để có thể tư duy thêm về phương pháp giải.

Dưới đây mình xin chia sẻ các bài tập assembly có lời giải cho các sinh viên :

Bài 1: Viết chương trình hiện ra câu “Hello Assembly”

.MODEL small .STACK 100h .DATA Message db ‘Hello Assembly!$’ .CODE ProgramStart: Mov AX,@DATA Mov DS,AX Mov DX,OFFSET Message Mov AH,9 Int 21h Mov AH,4Ch Int 21h END ProgramStart

Bài 2: Viết chương trình hiện ra hai câu “Chao mung ban den voi Assembly” “Assembly that de!”. Mỗi câu trên một dòng.

.MODEL small .STACK 100h .DATA Tbao1 db “Chao mung ban den voi Assembly$” Tbao2 db 0DH,0AH,”Assembly that de!$” .CODE ProgramStart: Mov AX,@DATA Mov DS,AX ;xuat thong bao 1 Lea DX,Tbao1 Mov AH,9 Int 21h ;xuat thong bao 2 Lea DX,Tbao2 Mov AH,9 Int 21h Mov AH,4Ch Int 21h END ProgramStart

Bài 3: Viết chương trình yêu cầu nhập một ký tự và xuất ra màn hình ký tự vừa nhập

.model small .stack .data TBao1 db “Hay nhap mot ky tu: $” TBao2 db 0DH,0AH,”Ky tu da nhap: $” KyTu db ? .code ProgramStart: Mov ax,@data Mov ds,ax ; nhac nhap Lea dx, TBao1 Mov ah, 9 int 21h ; nhap 1 ky tu Mov ah, 1 Int 21h Mov KyTu, al ; thong bao ket qua lea dx, TBao2 mov ah, 9 int 21h ; hien thi ky tu da nhap Mov ah, 2 Mov dl, KyTu Int 21h ; ve dos Mov ah, 4Ch Int 21h end

Bài 4: Viết chương nhập vào một ký tự. Chuyển ký tự đó sang ký tự hoa

.MODEL SMALL .STACK 100h .DATA Msg1 DB ‘Nhap vao ki tu thuong : $’ Msg2 DB 0Dh,0Ah,’Chuyen sang ki tu hoa la : ‘ Char DB ?,’$’  .CODE Main PROC     MOV AX,@DATA     MOV DS,AX     ; In ra thong bao 1     LEA DX,Msg1     MOV AH,9     INT 21h     ; Nhap vao 1 ki tu thuong va doi thanh ki tu hoa     MOV AH,1     INT 21h     ; Doc 1 ki tu thuong va luu vao AL     SUB AL,32h     ; Doi thanh ki tu hoa     MOV Char,AL     ; Hien len chu hoa     LEA DX,Msg2     MOV AH,9     INT 21h     ; Ket thuc chuong trinh     MOV AH,4Ch     INT 21h Main ENDP END Main

Bài 5: Chuyển đổi ký tự hoa thành ký tự thường

.MODEL SMALL .STACK 100h .DATA Msg1 DB ‘Nhap vao ki tu hoa : $’ Msg2 DB 0Dh,0Ah,’Chuyen sang ki tu thuong la : ‘ Char DB ?,’$’  .CODE Main PROC     MOV AX,@DATA     MOV DS,AX     ; In ra thong bao 1     LEA DX,Msg1     MOV AH,9     INT 21h     ; Nhap vao 1 ki tu hoa va doi thanh ki tu thuong     MOV AH,1     INT 21h     ; Doc 1 ki tu hoa va luu vao AL     ADD AL,32h     ; Doi thanh ki tu thuong     MOV Char,AL     ; Hien len chu thuong     LEA DX,Msg2     MOV AH,9     INT 21h     ; Ket thuc chuong trinh     MOV AH,4Ch     INT 21h Main ENDP END Main

Bài 6: Viết chương trình nhập vào một chuỗi. In ra màn hình chuỗi thường, chuỗi in. Dùng chương con.

.MODEL small .STACK .DATA tb1 DB ‘Nhap vao 1 chuoi: $’ tb2 DB 10,13,’Doi thanh chu thuong: $’ tb3 DB 10,13,’Doi thanh chu hoa: $’ s DB 100,?,101 dup(‘$’) .CODE BEGIN:     MOV AX, @DATA     MOV DS,AX     ;xuat chuoi tb1     MOV AH,09h     LEA DX,tb1     INT 21h     ;nhap chuoi s     MOV AH,0Ah     LEA DX,s     INT 21h     ;xuat chuoi tb2     MOV AH,09h     LEA DX,tb2     INT 21h     ; Goi chuong trinh con in chuoi thuong     CALL InChuoiThuong     ; xuat chuoi tb3     MOV AH,09h     LEA DX,tb3     INT 21h     ; Goi chuong trinh con in chuoi thuong     CALL InChuoiHoa      MOV AH,4ch     INT 21h     ;**************************************     ; Doi thanh chuoi ky tu thuong InChuoiThuong PROC     LEA SI,s+1     XOR CX,CX     MOV CL,[SI]     INC SI LapThuong:     MOV AH,02h     MOV DL,[SI]     CMP DL,’A’     JB LT1     CMP DL,’Z’     JA LT1     ADD DL,32 LT1:     INC SI     INT 21h     LOOP LapThuong     RET InChuoiThuong ENDP ; Doi thanh chuoi ky tu hoa InChuoiHoa PROC     LEA SI,s+1     XOR CX,CX     MOV CL,[SI]     INC SI LapHoa:     MOV AH,02h     MOV DL,[SI]     CMP DL,’a’     JB LH1     CMP DL,’z’     JA LH1     SUB DL,32 LH1:     INC SI     INT 21h     LOOP LapHoa     RET InChuoiHoa ENDP END BEGIN

Bài 8: Viết chương trình nhập vào một chuỗi. Đếm chiều dài của chuỗi nhập vào.

.MODEL small .STACK .DATA tb1 DB ‘Nhap vao 1 chuoi: $’ tb2 DB 10,13,’Tong chieu dai cua chuoi: $’ s DB 100,?,101 dup(‘$’) .CODE BEGIN:     MOV AX, @DATA     MOV DS,AX     ;xuat chuoi tb1     MOV AH,09h     LEA DX,tb1     INT 21h     ;nhap chuoi s     MOV AH,0Ah     LEA DX,s     INT 21h     ;xuat chuoi tb2     MOV AH,09h     LEA DX,tb2     INT 21h     ;Tinh chieu dai chuoi     XOR AX,AX     MOV AL,s+1 ;Chuyen chieu dai chuoi vao ax     MOV CX,0 ;Khoi tao bien dem     MOV BX,10 LapDem1:     MOV DX,0     DIV BX     PUSH DX     INC CX     CMP AX,0     JNZ LapDem1     ;xuat chieu dai chuoi     MOV AH,2 LapDem2:     POP DX     OR DL,’0’ ;chuyen chu so -> so     INT 21H     LOOP LapDem2      MOV AH,4Ch     INT 21h     END BEGIN

Bài 9: Lập chương trình nhập vào 2 số kiểu byte,in ra màn hình tích 2 số vừa nhập

.model tiny .stack 100h .data tb1 db ‘nhap a=$’ tb2 13,10,’nhap b=$’ tb3 13,10,’tich 2 so la:$’ so1 db 0 so2 db 0 .code main proc Mov ax,@data Mov ds,ax ; In thong bao nhap so thu 1 Lea dx,tb1 Mov ah,9 Int 21h nhap1:     mov ah,1     int 21h     cmp al,13 ;so sanh al voi 13     je nhap2 ;neu bang thi nhay den nhap 2     sub al,30h ; chuyen ky tu thanh so     mov dl,al ;cat al vao dl     mov al,so1 ; dua so vua nhap ve kieu byte     mov bl,10 ;gan bl =10     mul bl ; nhan al voi 10     add al,dl ;lay ket qua vua nhan cong voi so vua nhap     mov so1,al ;cat ket qua sau khi doi vao bien so1     jmp nhap1 ;nhay den nhan nhap 1 nhap2:     lea dx,tb2; in thong bao nhap so thu 2     mov ah,9     int 21h  nhap:     mov ah,1     int 21h     cmp al,13 ; so sanh so vua nhap voi enter     je tinhtich ;neu bang thi tinh tich     sub al,30h ; chuyen xau vua nhap thanh so     mov dl,al ;cat so vua nhap vao dl     mov al,so2 ;dua so vua nhap ve kieu byte     mov bl,10 ;gan bl=10     mul bl ; lay so ban dau nhan voi 10     add al,dl ;lay ket qua vua nhan cong voi so vua nhap     mov so2,al ;cat ket qua sau khi doi vao bien so2     jmp nhap  tinhtich:     mov al,so1 ;dua so vua nhap ra thanh ghi al     mul so2 ;nhan voi so 2     mov bx,ax ;lay ket qua vua tinh chuyen vao thanh ghi bx     jmp tinhtich ;in tich     mov ah,9 ;hien thong bao in tich     lea dx,tb3     int 21h     mov ax,bx ;chuyen ket qua ra thanh ghi ax     mov bx,10 ;gan bx=10     xor cx,cx ;khoi tao bien dem     chia:         xor dx,dx ;xoa bit cao         div bx ;lay ket qua chia cho 10         add dx,30h ;chuyen so vua nhap sang dang ky tu         push dx ;dẩy du vào ngăn xếp         inc cx ;tăng biến đếm         cmp ax,0 ;so sanh thuong voi 0         jne chia     mov ah,2 LapDem2:     pop dx ;lấy du trong ngăn xếp ra khỏi dx     add dl,30h ;chuyen so sang dang ki tu     int 21h ;thuc hien in ky tu nam trong dl ra man hinh     loop LapDem2     mov ah,4ch     int 21h main endp end main

Bài 10 : Lập chương trình nhập vào 2 số kiểu word,in ra màn hình tổng 2 số vừa nhập

.model tiny .stack 100h .data tb1 db ‘nhap so thu 1:$’ tb2 db 10,13,’nhap so thu 2:$’ tb3 db 10,13,’tong 2 so$’ so1 dw 0 so2 dw 0 tong dw 0 .code main proc     mov ax,@data     mov ds,ax     ; in thong bao nhap so thu nhat     lea dx,tb1     mov ah,9     int 21h     nhap:     mov ah,1     int 21h     cmp al,13 ; so sanh so vua nhap voi enter     je inso ; neu bang thi in so     sub al,30h ; chuyen xau vua nhap thanh so     mov dl,al ; cat so vua nhap vao dl     mov al,so1 ; dua so vua nhap ve kieu byte     mov bx,10 ; gan bx=10     mul bx ; lay so ban dau nhan voi 10     add al,dl ; lay ket qua vua nhan cong voi so vua nhap     mov so1,al ; cat ket qua vao bien so1     jmp nhap     inso:     ; in thong bao nhap so thu 2     lea dx,tb2     mov ah,9     int 21h     nhap2:     mov ah,1     int 21h     cmp al,13 ; so sanh so vua nhap voi enter     je tinhtong ; neu bang thi tinh tong     sub al,30h ; chuyen xau vua nhap thanh so     mov dl,al ; cat so vua nhap vao dl     mov al,so2 ; dua so vua nhap ve kieu byte     mov bx,10 ; gan bx=10     mul bx ; lay so ban dau nhan voi 10     add al,dl ; lay ket qua vua nhan cong voi so vua nhap     mov so2,al ; cat ket qua vao bien so2     jmp nhap2     tinhtong:     mov ax,so1 ; dua so vua nhap ra thanh ghi ax     add ax,so2 ; cong ax voi so 2     lea dx,tb3 ; xuat thong bao tong     mov ah,9     int 21h     mov bx,10 ; gan bx=10     xor cx,cx ; khoi tao bien dem     chia:     xor dx,dx ; xoa bit cao trong dx     div bx ; lay ket qua chia cho 10     add dl,30h ; chuyen du thanh dang ky tu     push dx ; day du trong dx vao ngan xep     inc cx ; tang bien dem     cmp ax,0 ; so sanh thuong voi 0     ja chia     mov ah,2     lap:     pop dx ; lay du trong stack khoi dx     add dl,30h ; chuyen so vua nhap sang dang ky tu     int 21h ; thuc hien in ky tu nam trong dl ra man hinh     loop lap     mov ah,4ch     int 21h main endp end main

Bài 11 : Cho một mảng M gồm 20 phần tử kiểu Word giá trị tuỳ ý(không phải nhập giá trị các phần tử).Tính tổng giá trị các phần tử có giá trị chia hết cho 7

.model tiny .stack 100h .data st1 db 13,10,’tong cac phan tu chia het cho 7:$’ st2 db 13,10,’Khong co phan tu nao chia het cho 7$’ m db 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 a db 0 .code Main proc     MOV AX,@DATA     MOV DS,AX     xor bx,bx     xor cx,cx     xor ax,ax     mov cx,20     mov di,offset m     lap:     mov ax,[di]     xor dx,dx     mov bx,7     div bx     cmp dx,0     jne khong     add ax,cx     mov cx,ax     khong:     add di,2     loop lap     cmp cx,0     jne inra     mov ah,9     lea dx,st2     int 21h     jmp thoat     inra:     mov ah,9     lea dx,st1     int 21h     mov ah,2     mov dl,cx     add dl,30h     int 21h     thoat:     mov ah,4ch     int 21h Main endp end Main

Bài 12 : Lập chương trình nhập vào 1 số kiểu word in ra màn hình mã nhị phân tương ứng của số đó

.model tiny .stack 100h .data st1 db ‘Nhap so kieu word :$’ st2 db 13,10,’so do duoi dang hecxa:$’ a dw 0 .code Main proc     MOV AX,@DATA     MOV DS,AX     jmp over     x1 db 80 dup(‘$’)     x2 db 80 dup(‘$’)     over:     MOV ah,9     LEA dx,st1     INT 21h     MOV ah,1     INT 21h     AND al,0FH     MOV a,ax     MOV ah,9     LEA dx,st2     INT 21h     MOV SI,10     LES DI,x2     PUSH CX     MOV CX,4 lop:     XOR dx,dx     DIV SI     ADD dl,30h     CMP dl,39h     JBE L1     ADD dl,7 L1:     STOSB     LOOP lop     POP CX     rep STOSB     mov ah,9     lea dx,x2     int 21h     mov ah,4ch     int 21h Main ENDP End Main

Bài 13 : Lập chương trình nhập vào 1 số kiểu word in ra màn hình mã Hexa tương ứng của số đó

.model tiny .stack 100h .data st1 db ‘nhap so kieu word:$’ st2 db 13,10,’so do duoi dang hecxa:$’ a dw 0 .code Main proc     mov ax,@data     mov ds,ax     jmp over     x1 db 80 dup(‘$’)     x2 db 80 dup(‘$’)     over:      mov ah,9     LEA dx,st1     INT 21h     mov ah,1     INT 21h     cmp al,0     je thoat     sub al,30h     mov cl,al     mov ah,9     LEA DX,st2     INT 21h     mov ah,1     INT 21h     cmp al,0     je thoat     sub al,30h     mov dl,al     mov al,cl     shl al,4     add al,dl     mov cl,al     mov ah,2     int 21h     jmp over     thoat:     mov dl,13     mov ah,2     int 21h     mov dl,10     mov ah,2     int 21h     mov ah,9     LEA DX,st1     INT 21h     mov ah,2     int 21h     mov cl,0     mov dl,0     mov ch,0     clc     inc dl     sbb ch,ch     mov bx,2 lap:     shr cl,1     ror dl,1     rcr ch,1     rol bx,1     mov ah,2     int 21h     dec bx     jnz lap     jmp over Main ENDP End Main

Bài 14 : Nhập vào 1 mảng 15 phần tử kiểu word in ra màn hình mã Hexa tương ứng của số đó.

.model tiny .stack 100h .data st1 db 13,10,’Nhap mang 15 phan tu kieu word: $’ st2 db 10, 13,’Nhap phan tu : $’ st3 db 10, 13,’Phan tu co gia tri lon nhat la: $’ a db 0 .code Main proc mov ax,@data mov ds,ax jmp start x1 db 80 dup(‘$’) over: jmp over start: MOV AH,9 LEA DX,st1 INT 21h MOV BYTE ptr[di],’$’ INC SI LEA SI,x1 @write ‘nhap phan tu thu ‘ int 21h mov ah,9 lea dx,st2 int 21h mov ah,1 int 21h sub al,30h mov ah,0 xor dx,dx mul si mov bx,10 div bx add dx,30h mov bh,ah mov byte ptr[di],dl inc di mov al,bh add al,30h mov byte ptr[di],al inc di mov ah,9 lea dx,st1 int 21h mov ah,2 lea dx,x1 int 21h inc si cmp si,30h jnz start inc di lea si,x1 repne scasb dec di mov ah,9 lea dx,st3 int 21h inc di mov cx,(15+1)*2 @@: mov dl,[di] mov ah,2 int 21h add di,1 loop @b int 20h Main ENDP END Main

Bài 15 : Tính tổng 2 số

include mylib.mac code segment assume cs: code org 100h start: jmp over tb1 db ‘Nhap a=$’ tb2 13,10,’nhap b=$’ tb3 13,10,’tong 2 so la:$’ over: mov ah,9 lea dx,tb1 int 21h mov ah,1 int 21h cmp al,13 ;so sanh al voi 13 je nhap2 ;neu bang thi nhay den nhap 2 sub al,30h ; chuyen ky tu thanh so mov dl,al ;cat al vao dl mov al,so1 ; dua so vua nhap ve kieu byte mov bl,10 ;gan bl =10 mul bl ; nhan al voi 10 add al,dl ;lay ket qua vua nhan cong voi so vua nhap mov so1,al ;cat ket qua sau khi doi vao bien so1 jmp nhap1 ;nhay den nhan nhap 1 nhap2: lea dx,tb2; in thong bao nhap so thu 2 mov ah,9 int 21h nhap: mov ah,1 int 21h cmp al,13 ;so sanh so vua nhap voi enter je tinhtong ;neu bang thi tinh tong sub al,30h ; chuyen xau vua nhap thanh so mov dl,al ;cat so vua nhap vao dl mov al,so2 ;dua so vua nhap ve kieu byte mov bl,10 ;gan bl=10 mul bl ;lay so ban dau nhan voi 10 add al,dl ;lay ket qua vua nhan cong voi so vua nhap mov so2,al ;cat ket qua vao bien so2 jmp nhap tinhtong: mov ax,so1 ;dua so vua nhap ra thanh ghi ax add ax,so2 ;cong ax voi so 2 lea dx,tb3 ;xuat thong bao tong mov ah,9 int 21h mov bx,10 ;gan bx=10 xor cx,cx ;khoi tao bien dem chia: xor dx,dx ;xoa bit cao trong dx div bx ;lay ket qua chia cho 10 add dx,30h ;chuyen so vua nhap sang dang ky tu push dx ;dẩy du vào ngăn xếp inc cx ;tăng biến đếm cmp ax,0 ;so sanh thuong voi 0 jne chia mov ah,2 lap: pop dx ;lay du trong ngăn xếp ra tablet khoi dx add dl,30h ;chuyen so vua nhap sang dang ky tu int 21h ;thuc hien in ky tu nam trong dl ra man hinh loop lap mov ah,4ch int 21h code ends end start

Bài 16: Tính số Fibonacy thứ n

.MODEL tiny .STACK 100h .DATA n dw ? .CODE Start: jmp over st1 db 13,10,’Nhap n = $’ st2 db 10, 13,’So thap phan tuong ung la 1$’ st3 db 10, 13,’So thap phan tuong ung la 1$’ temp dw 0 over:   @write ‘Nhap n = ‘  Call nhap_so  cmp ax,2   jbe ngt   mov n,ax   mov ax,1   mov bx,1   mov cx,2  tinh:  add bx,ax   sub ax,bx   neg ax   inc cx   cmp n,cx   je thoat1   @write ‘So Fibonaci thu n la ‘   mov ax,bx   call in_so   jmp over   ngt:   @xuongdong   @write ‘Khong phai so Fibonaci’   jmp thoat   thoat1:   @xuongdong   @write ‘So thap phan tuong ung la 1’   thoat:   int 20h  Include Proc.asm Code Ends End Start

Bài 17: Kiểm tra tính chẵn lẻ của chữ số

include mylib.mac code segment assume cs:code org 100h start:jmp over tb1 db 10,13,’Nhap ki tu so kt = $’ tb2 db 10,13,’la chu chan$’ tb3 db 10,13,’la chu le$’ tb4 db 10,13,’Hay nhap lai voi ( 0 = kt = 9) $’ over: mov ah,9 lea dx,tb1 int 21h mov ah,1 int 21h sub al,30h cmp al,9 jae ko cmp al,0 jb ko mov dl,al jz chan mov ah,9 lea dx,tb2 int 21h jmp het ko: mov ah,9 lea dx,tb3 int 21h jmp het chan: mov ah,9 lea dx,tb2 int 21h het: mov ah,4ch int 21h include proc.asm code ends end start

Bài 18: Kiểm tra số

1