沒啥好說的,總結我電一波實驗題目,關於匯編的……
題目要求
實驗一 EMU8086使用及8086指令系統
· 編寫一個簡單的程序:將“This is my first ASM program-姓名(漢語拼音各人的姓名)”放在DS=1000H,BX=0000H開始的存儲器單元中,然后將該內容搬移到BX=0100H開始的單元中,最后將該字符串通過DOS功能調用顯示在屏幕上。
實驗二 數制轉換與數值運算編程
· 2.1 將ASCII碼表示的十進制數轉換為二進制數。
· 2.2 BCD碼轉換為二進制數
· 2.3 兩個非壓縮BCD數加法程序。
· 2.4 從鍵盤上輸入任意兩個不大於2位數的正整數,計算其乘積。結果在屏幕上顯示。
實驗三 順序、分支、循環、子程序設計
· 3.1 教材P74例1。m=6,n=4,w=7。結果Q也放在內存中。
· 3.2 教材P75例3。
· 3.3 從鍵盤上輸入1個數,判斷其奇偶性,如果是奇數,屏幕上顯示”It is odd”,否則顯示”It is even”。
· 3.4 從鍵盤上輸入N個字符(N<16),求這N個字符中’A’的個數,並將’A’的個數顯示在屏幕上。
· 3.5 已知BUF1中有N1個按從小到大的順序排列的互不相等的無符號數,BUF2中有N2個從小到大的順序排列的互不相等的無符號數。編寫程序將BUF1和BUF2中的數合並到BUF3中,使在BUF3中存放的數互不相等且按從小到大的順序排列。
實驗四 綜合性匯編程序設計
· 4.1 計算S=1+2×3+3×4+4×5+…+N(N+1),直到N(N+1)項大於200為止。
· 4.2 求N!。N為鍵盤輸入的不大於8的正整數。
· 4.3 從鍵盤輸入一行字符(以回車符結束),並按字母、數字及其它字符分類計數,最后顯示出這3個計數結果。
程序清單及結果:
1.

1 name "mycode" 2 org 100h 3 ; set segment register: 4 mov ax, 1000h 5 mov ds, ax 6 mov bx,0000h 7 ; print "This is my first ASM program-WangYuBo" 8 mov [02h], 'T' 9 mov [04h], 'h' 10 mov [06h], 'i' 11 mov [08h], 's' 12 mov [0ah], ' ' 13 mov [0ch], 'i' 14 mov [0eh], 's' 15 mov [10h], ' ' 16 mov [12h], 'm' 17 mov [14h], 'y' 18 mov [16h], ' ' 19 mov [18h], 'f' 20 mov [1ah], 'i' 21 mov [1ch], 'r' 22 mov [1eh], 's' 23 mov [20h], 't' 24 mov [22h], ' ' 25 mov [24h], 'A' 26 mov [26h], 'S' 27 mov [28h], 'M' 28 mov [2ah], ' ' 29 mov [2ch], 'p' 30 mov [2eh], 'r' 31 mov [30h], 'o' 32 mov [32h], 'g' 33 mov [34h], 'r' 34 mov [36h], 'a' 35 mov [38h], 'm' 36 mov [3ah], '-' 37 mov [3ch], 'W' 38 mov [3eh], 'a' 39 mov [40h], 'n' 40 mov [42h], 'g' 41 mov [44h], 'Y' 42 mov [46h], 'u' 43 mov [48h], 'B' 44 mov [4ah], 'o' 45 mov cx,0025h ;一共37個字符 46 mov bx,0100h 47 mov si,0002h 48 ;string copy 49 copy: 50 mov ax,ds:[si] 51 mov ds:[bx+si],ax 52 add si,2 53 loop copy 54 mov bx,0102h 55 mov cx,0025h 56 ;printf string 57 printf: 58 mov dl,[bx] 59 mov ah,02h 60 int 21h 61 add bx,2 62 loop printf 63 mov ah,1 64 int 21h 65 66 mov ah,4ch 67 int 21h 68 ret
2.1

1 DATA SEGMENT 2 index DB 30H,30H,32H,35H,36H 3 DATA ENDS 4 5 CODE SEGMENT 6 ASSUME CS:CODE, DS:DATA 7 START: 8 MOV AX, DATA 9 MOV DS, AX 10 MOV SI, OFFSET index 11 MOV CX,5 12 FOR1: 13 MOV AL,[SI] 14 SUB AL,30H 15 MOV [SI],AL 16 INC SI 17 LOOP FOR1 18 MOV AX,0000h 19 MOV BX,0000h 20 LEA SI,index 21 22 MOV DX,10000 23 MOV AL,[SI] 24 IMUL DX 25 MOV BX,AX 26 27 MOV DX,1000 28 INC SI 29 MOV AL,[SI] 30 IMUL DX 31 ADD BX,AX 32 33 MOV DX,100 34 INC SI 35 MOV AL,[SI] 36 IMUL DX 37 ADD BX,AX 38 39 MOV DX,10 40 INC SI 41 MOV AL,[SI] 42 IMUL DX 43 ADD BX,AX 44 45 INC SI 46 MOV AL,[SI] 47 ADD BX,AX 48 49 MOV AX,BX 50 51 ;MOV AX,4C00h 52 ;INT 21h 53 54 CODE ENDS 55 END START
2.2

1 code segment 2 ASSUME CS:CODE 3 start: 4 ;store data at ds:[3500h]~ds:[3507h] 5 mov si,3500h 6 mov [si],01 7 mov [si+1],02 8 mov [si+2],03 9 mov [si+3],04 10 mov [si+4],05 11 mov [si+5],06 12 mov [si+6],07 13 mov [si+7],08 14 mov cx,4 15 mov di,3510h 16 mov ax,0000h 17 mov bx,000Ah 18 mov dx,0000h 19 for: 20 mov al,ds:[si] 21 imul bl 22 mov dx,ds:[si+1] 23 and dx,00FFh 24 adc ax,dx 25 mov ds:[di],al 26 add si,2 27 inc di 28 loop for 29 mov ax, 4c00h 30 int 21h 31 ends 32 end start
2.3

1 code segment 2 ASSUME CS:CODE 3 start: 4 mov [0],01010110b ;56h 5 mov [1],00h 6 mov [2],01111000b ;78h 十進制和為134 7 mov [3],00h 8 mov ax,[0] ; ax = 0056h 9 mov bx,[2] ; bx = 0078h 10 mov cx,000Ah 11 mov dx,0000h ;累加和 12 push ax 13 push bx 14 and ax,00F0h 15 and bx,00F0h 16 add ax,bx 17 shr ax,4 ;dx = 000c h 18 imul cx 19 mov dx,ax 20 pop bx 21 pop ax 22 and ax,000Fh 23 and bx,000Fh 24 add ax,bx 25 add dx,ax ;dx store the sum in hex 26 ;----------- print dx with demical number -------- 27 mov ax,dx 28 mov cx,0 29 mov bx,10 30 disp1: 31 mov dx,0 32 div bx 33 push dx 34 inc cx 35 or ax,ax 36 jne disp1 37 disp2: 38 mov ah,2 39 pop dx 40 add dl, 30H 41 int 21h 42 loop disp2 43 ;-----------the end------------ 44 mov ax,4c00h 45 int 21h 46 ends 47 end start
2.4

1 data segment 2 str1 db 'please input a number to a:$' 3 str2 db 'please input a number to b:$' 4 str3 db 'result c=a*b=$' 5 a dw ? 6 b dw ? 7 c dw ? 8 data ends 9 10 code segment 11 assume cs:code,ds:data 12 main proc far 13 start: 14 mov ax,data 15 mov ds,ax 16 lea dx,str1 ;ouput str1 17 mov ah,9h 18 int 21h 19 call input ;input a 20 mov a,bx 21 lea dx,str2 ;ouput str2 22 mov ah,9h 23 int 21h 24 call input ;input b 25 mov b,bx 26 lea dx,str3 ;ouput str3 27 mov ah,9h 28 int 21h 29 mov ax,a 30 aad 31 mov bx,ax 32 mov ax,b 33 aad 34 mul bx ;ax = a*b 35 mov word ptr c,ax ;c = a*b 36 mov di,0ah ;di = 10 37 mov cx,0 38 ToTen: ;convert to decimal 39 div di 40 push dx 41 inc cx 42 cmp ax,0 43 je print 44 cwd 45 jmp ToTen 46 print: ;output result 47 pop dx 48 add dl,30h 49 mov ah,2h 50 int 21h 51 loop print 52 ret 53 main endp 54 input proc 55 mov bx,0 56 inputa: 57 mov ah,1 ;first char 58 int 21h 59 sub al,30h 60 mov bl,al 61 mov ah,1 ;second char 62 int 21h 63 cmp al,0dh ;compare if al==Enter 64 je exit 65 sub al,30h 66 mov cl,8 ;shift operation 67 rol bx,cl 68 mov bl,al 69 jmp exit 70 exit: 71 call crlf 72 ret 73 input endp 74 ;print next line 75 crlf proc near 76 mov dl,0ah 77 mov ah,2h 78 int 21h 79 mov dl,0dh 80 mov ah,2h 81 int 21h 82 ret 83 crlf endp 84 85 code ends 86 end start
3.1

1 data segment 2 address db 06h,04h,07h 3 string1 db ' m=6,n=4,w=7 $' 4 string2 db ' m * n - w = $' 5 data ends 6 7 code segment 8 ASSUME CS:CODE,DS:data 9 main: 10 mov ax,data 11 mov ds,ax 12 mov si,offset address 13 mov al,[si] ;al = m = 6 14 mov bl,[si+1] ;bl = n = 4 15 mul bl ;al = m*n 16 push ax 17 lea dx,string1 ;output string1 18 mov ah,09h 19 int 21h 20 call crlf 21 pop ax 22 mov bx,0 ;bl = 0 23 mov bl,[si+2] ;bl = w = 7 24 sub ax,bx ;ax = m * n - w 25 push ax 26 lea dx,string2 ;output string2 27 mov ah,09h 28 int 21h 29 pop ax 30 ;print demical result 31 mov cx,0 32 mov bx,10 33 disp1: 34 mov dx,0 35 div bx ;如果除數是16位,AX儲存商,DX儲存余數 36 push dx 37 inc cx 38 or ax,ax 39 jne disp1 40 disp2: 41 mov ah,2 42 pop dx 43 add dl, 30H 44 int 21h 45 loop disp2 46 mov ax,4c00h 47 int 21h 48 49 crlf proc near 50 push dx 51 mov dl,0ah 52 mov ah,2h 53 int 21h 54 mov dl,0dh 55 mov ah,2h 56 int 21h 57 pop dx 58 ret 59 crlf endp 60 code ends 61 end main
3.2

1 shuju segment 2 DATA db 94,61,86,86,53,84,81,63,45,80,58,81,75,95, 70,85,49,46,85,77,87,99,94,66,78,48,86,65,76,89,74,93,73,100,54,78,75,53,86,50,53,68,63,86,78,62,100,56,48,63,63,52,80,46,100,69,49,95,93,54,75,82,95,51,88,100,82,82,54,96,63,79,66,94,78,81,95,86,95,67 3 BUFFER 4 dup(0) 4 str0 db "The 80 scores are: $" 5 str1 db "#Number of score above 90 points: $" 6 str2 db "#Number of score between 70 points and 89 points: $" 7 str3 db "#Number of score between 60 points and 69 points: $" 8 str4 db "#Number of score above 60 points: $" 9 shuju ends 10 11 code segment 12 assume CS:code,DS:shuju 13 main: 14 mov ax,shuju 15 mov ds,ax 16 mov dx,0000h 17 mov bx,0000h 18 mov cx,80 19 mov si,offset DATA 20 mov di,offset BUFFER 21 nine: 22 mov al,[si] 23 cmp al,90 24 jc eight 25 inc dh 26 jmp stor 27 eight: 28 cmp al,70 29 jc six 30 inc dl 31 jmp stor 32 six: 33 cmp al,60 34 jc five 35 inc bh 36 jmp stor 37 five: 38 inc bl 39 stor: 40 inc si 41 loop nine 42 43 mov [di],dh 44 mov [di+1],dl 45 mov [di+2],bh 46 mov [di+3],bl 47 48 lea dx,str0 ;output string0 49 mov ah,09h 50 int 21h 51 mov cx,80 52 lea si,DATA 53 show: 54 mov ax,0 55 mov al,[si] 56 call printf 57 call space 58 inc si 59 loop show 60 call crlf 61 lea dx,str1 62 mov ah,09h 63 int 21h 64 mov ax,0 65 mov al,[di] 66 call printf 67 call crlf 68 lea dx,str2 69 mov ah,09h 70 int 21h 71 mov ax,0 72 mov al,[di+1] 73 call printf 74 call crlf 75 lea dx,str3 76 mov ah,09h 77 int 21h 78 mov ax,0 79 mov al,[di+2] 80 call printf 81 call crlf 82 lea dx,str4 83 mov ah,09h 84 int 21h 85 mov ax,0 86 mov al,[di+3] 87 call printf 88 call crlf 89 mov ax,4c00h 90 int 21h 91 92 printf proc near 93 push cx 94 push bx 95 push dx 96 mov cx,0 97 mov bx,10 98 disp1: 99 mov dx,0 100 div bx 101 push dx 102 inc cx 103 or ax,ax 104 jne disp1 105 disp2: 106 mov ah,2 107 pop dx 108 add dl,30H 109 int 21h 110 loop disp2 111 ;call crlf 112 pop dx 113 pop bx 114 pop cx 115 ret 116 printf endp 117 crlf proc near 118 push ax 119 push dx 120 mov dl,0ah 121 mov ah,2h 122 int 21h 123 mov dl,0dh 124 mov ah,2h 125 int 21h 126 pop dx 127 pop ax 128 ret 129 crlf endp 130 131 space proc near 132 push ax 133 push dx 134 mov dl,20h 135 mov ah,2h 136 int 21h 137 pop dx 138 pop ax 139 ret 140 space endp 141 code ends 142 end main
3.3

1 assume cs:code,ds:data 2 3 data segment 4 string0 db 'Welcome to here!Input a number: $' 5 string1 db 'It is odd $' 6 string2 db 'It is even $' 7 string3 db 'Inlegal character!$' 8 data ends 9 10 code segment 11 start: 12 mov ax,data 13 mov ds,ax 14 lea dx,string0 ;output string0 15 mov ah,09h 16 int 21h 17 18 mov cx,10 19 input: 20 mov ah,01h 21 int 21h 22 cmp al,39h 23 ja inlegal 24 cmp al,0dh ;enter \r\n 25 je outside 26 mov bl,al 27 loop input 28 inlegal: 29 call CRLF 30 lea dx,string3 ;output string3 31 mov ah,09h 32 int 21h 33 jmp tail 34 outside: 35 call CRLF 36 and bl,01h 37 cmp bl,1 38 jne even 39 odd: 40 lea dx,string1 41 mov ah,09h 42 int 21h 43 jmp tail 44 even: 45 lea dx,string2 46 mov ah,09h 47 int 21h 48 49 tail: 50 mov ax,4c00h 51 int 21h 52 53 CRLF PROC NEAR 54 PUSH AX 55 PUSH DX 56 MOV DL,0AH 57 MOV AH,2H 58 INT 21H 59 MOV DL,0DH 60 MOV AH,2H 61 INT 21H 62 POP DX 63 POP AX 64 RET 65 CRLF ENDP 66 67 code ends 68 end start
3.4

1 data segment 2 string1 db 'please input a string: $' 3 string2 db 'the number of char a: $' 4 data ends 5 6 code segment 7 main proc far 8 assume cs:code,ds:data 9 start: 10 mov ax,data 11 mov ds,ax 12 mov cx,16 13 lea dx,string1 ;output string1 14 mov ah,09h 15 int 21h 16 mov dx,0 ;dl store the number of 'a' 17 write: 18 mov ah,1h 19 int 21h 20 cmp al,0dh ;enter \r\n 21 je print 22 cmp al,41h ;'a' 23 jne next 24 inc dl ;dl++ 25 next: 26 loop write 27 28 print: 29 call crlf 30 push dx 31 lea dx,string2 32 mov ah,09h 33 int 21h 34 pop dx 35 add dl,30h 36 mov ah,02h 37 int 21h 38 39 mov ax,4c00h 40 int 21h 41 main endp 42 43 crlf proc near 44 push dx 45 mov dl,0ah 46 mov ah,2h 47 int 21h 48 mov dl,0dh 49 mov ah,2h 50 int 21h 51 pop dx 52 ret 53 crlf endp 54 code ends 55 end start
3.5

1 data segment 2 BUF1 db 1,2,3,5,7,9 3 BUF2 db 0,2,4,6,8 4 BUF3 db 32 dup(204) 5 N1 db 6 6 N2 db 5 7 string db 'Array merged completed!$' 8 data ends 9 10 code segment 11 ASSUME CS:CODE,DS:DATE 12 start: 13 mov ax,data 14 mov ds,ax 15 lea si,BUF1 ;pointer of buffer1 16 lea di,BUF2 ;pointer of buffer2 17 lea bx,BUF3 ;pointer of buffer3 18 mov ax,0 19 mov cx,0 20 mov dx,0 21 mov ah,N1 ;number of N1 22 mov al,N2 ;number of N2 23 mov cl,N1 24 add cl,N2 ;number of N1+N2 25 mov dx,word ptr N2 ;number of N1+N2-1 26 dec dx 27 mov dh,0 28 add dl,ah 29 30 mov ax,word ptr N1 ;number of N1-1 31 dec ax 32 mov ah,0 33 while: 34 cmp si,ax 35 ja b2 36 cmp di,dx 37 ja b1 38 push dx 39 mov dx,[di] 40 cmp [si],dl 41 pop dx 42 ja b2 ;buf1[si] > buf2[di] 43 jb b1 ;buf1[si] < buf2[di] 44 push dx 45 push ax 46 mov dx,[si] 47 mov [bx],dl;buf1[si] == buf2[di] 48 add dl,30h 49 mov ah,2h 50 int 21h 51 pop ax 52 pop dx 53 inc si 54 inc di 55 inc bx 56 dec cx 57 jmp tail 58 b2: 59 push dx 60 push ax 61 mov dx,[di] 62 mov [bx],dl 63 add dl,30h 64 mov ah,2h 65 int 21h 66 pop ax 67 pop dx 68 inc bx 69 inc di 70 jmp tail 71 b1: 72 push dx 73 push ax 74 mov dx,[si] 75 mov [bx],dl 76 add dl,30h 77 mov ah,2h 78 int 21h 79 pop ax 80 pop dx 81 inc bx 82 inc si 83 tail: 84 loop while 85 call crlf 86 lea dx,string 87 mov ah,09h 88 int 21h 89 90 mov ax,4c00h 91 int 21h 92 93 crlf proc near 94 push dx 95 mov dl,0ah 96 mov ah,2h 97 int 21h 98 mov dl,0dh 99 mov ah,2h 100 int 21h 101 pop dx 102 ret 103 crlf endp 104 code ends 105 end start
4.1

1 data segment 2 string0 db 'Now value of n*(n+1)= 1,and value of S= 1$' 3 string1 db 'Now value of n*(n+1)= $' 4 string2 db ',and value of S= $' 5 string3 db 'Eventually value of S= $' 6 data ends 7 ; calculate 1 + 2*3 + 3*4 + 4*5 +......+n*(n+1) until n*(n+1)>200 8 code segment 9 start: 10 ;-------initialization------- 11 mov ax,data 12 mov ds,ax 13 lea dx,string0 14 mov ah,09h 15 int 21h 16 call crlf 17 mov ax,2 ; ax=2 18 mov bx,ax 19 inc bx ; bx=3 : bx-1 = ax 20 mov cx,15 ; 大概循環15次 21 mov dx,1 ; dx=1 : dx store the value S 22 for: 23 imul bl ; al = n*(n+1) 24 cmp al,200 25 ja outside 26 add dx,ax ; dx = S 27 push bx 28 push cx 29 push dx 30 push ax 31 lea dx,string1 32 mov ah,09h 33 int 21h 34 pop ax 35 call print 36 ;push ax 37 lea dx,string2 38 mov ah,09h 39 int 21h 40 ;pop ax 41 pop dx 42 mov ax,dx 43 push dx 44 call print 45 call crlf 46 pop dx 47 pop cx 48 pop bx 49 mov ax,bx 50 inc bx 51 loop for 52 outside: 53 mov ax,dx 54 push ax 55 lea dx,string3 ;output string3 56 mov ah,09h 57 int 21h 58 pop ax 59 call print 60 mov ax, 4c00h 61 int 21h 62 63 crlf: 64 PUSH AX 65 PUSH DX 66 MOV DL,0AH 67 MOV AH,2H 68 INT 21H 69 MOV DL,0DH 70 MOV AH,2H 71 INT 21H 72 POP DX 73 POP AX 74 RET 75 print: 76 push ax 77 mov cx,0 78 mov bx,10 79 disp1: 80 mov dx,0 81 div bx 82 push dx 83 inc cx 84 or ax,ax 85 jne disp1 86 disp2: 87 mov ah,2 88 pop dx 89 add dl, 30H 90 int 21h 91 loop disp2 92 pop ax 93 ret 94 95 code ends 96 end start
4.2

1 data segment 2 string0 db 'Welcome to here!Input a number: $' 3 string1 db 'Inlegal character! $' 4 string2 db 'Result of N! = $' 5 data ends 6 7 code segment 8 assume cs:code,ds:data 9 start: 10 mov ax,data 11 mov ds,ax 12 lea dx,string0 13 mov ah,09h 14 int 21h 15 mov ah,01h ;input number N 16 int 21h 17 call CRLF 18 cmp al,38h ; N <= 8 19 ja inlegal 20 cmp al,30h ; N >= 0 21 jb inlegal 22 je part01 23 cmp al,31h 24 je part01 25 sub al,30h 26 mov cx,0 27 mov cl,al 28 dec cl ;cx = N-1 29 mov ax,1 30 mov bx,2 31 mov dx,0 ; store the value of N! 32 mul: 33 imul bx 34 mov dx,ax 35 inc bx 36 loop mul 37 push dx ; dx = N! 38 lea dx,string2 39 mov ah,09h 40 int 21h 41 pop ax ; ax = N! 42 call print 43 tail: 44 mov ax, 4c00h 45 int 21h 46 part01: 47 lea dx,string2 48 mov ah,09h 49 int 21h 50 mov ax,1 51 call print 52 jmp tail 53 inlegal: 54 lea dx,string1 ;output string1 55 mov ah,09h 56 int 21h 57 jmp tail 58 print: 59 push ax 60 mov cx,0 61 mov bx,10 62 disp1: 63 mov dx,0 64 div bx 65 push dx 66 inc cx 67 or ax,ax 68 jne disp1 69 disp2: 70 mov ah,2 71 pop dx 72 add dl,30H 73 int 21h 74 loop disp2 75 pop ax 76 ret 77 CRLF: 78 PUSH AX 79 PUSH DX 80 MOV DL,0AH 81 MOV AH,2H 82 INT 21H 83 MOV DL,0DH 84 MOV AH,2H 85 INT 21H 86 POP DX 87 POP AX 88 RET 89 ends 90 end start
4.3

1 data segment 2 string0 db ' Welcome to here!Input a string: $' 3 string1 db '**********Count of alphabet: $' 4 string2 db '**********Count of number: $' 5 string3 db '**********Count of other character: $' 6 count_alph db 0 7 count_num db 0 8 count_char db 0 9 ends 10 11 code segment 12 assume cs:code,ds:data 13 start: 14 mov ax, data 15 mov ds, ax 16 lea si,count_alph 17 lea dx,string0 ;output string0 18 mov ah,09h 19 int 21h 20 mov cx,40 21 input: 22 mov ah,01h 23 int 21h 24 cmp al,0dh ;enter \r\n 25 je printf_count 26 cmp al,48 ;'0' 27 jb add_char 28 cmp al,58 ;'9'+1 29 jb add_num 30 cmp al,65 ;'A' 31 jb add_char 32 cmp al,91 ;'Z'+1 33 jb add_alph 34 cmp al,97 ;'a' 35 jb add_char 36 cmp al,123 ;'z'+1 37 jb add_alph 38 jmp add_char 39 inside: 40 loop input 41 printf_count: 42 call crlf 43 call crlf 44 lea dx,string1 ;output string1 45 mov ah,09h 46 int 21h 47 mov al,[si] 48 mov ah,0 49 call print 50 call crlf 51 call crlf 52 lea dx,string2 ;output string2 53 mov ah,09h 54 int 21h 55 mov al,[si+1] 56 mov ah,0 57 call print 58 call crlf 59 call crlf 60 lea dx,string3 ;output string3 61 mov ah,09h 62 int 21h 63 mov al,[si+2] 64 mov ah,0 65 call print 66 tail: 67 mov ax, 4c00h 68 int 21h 69 crlf: 70 PUSH AX 71 PUSH DX 72 MOV DL,0AH 73 MOV AH,2H 74 INT 21H 75 MOV DL,0DH 76 MOV AH,2H 77 INT 21H 78 POP DX 79 POP AX 80 RET 81 print: 82 push ax 83 mov cx,0 84 mov bx,10 85 disp1: 86 mov dx,0 87 div bx 88 push dx 89 inc cx 90 or ax,ax 91 jne disp1 92 disp2: 93 mov ah,2 94 pop dx 95 add dl, 30H 96 int 21h 97 loop disp2 98 pop ax 99 ret 100 add_alph: 101 push dx 102 mov dl,[si] 103 inc dl 104 mov [si],dl 105 pop dx 106 jmp inside 107 add_num: 108 push dx 109 mov dl,[si+1] 110 inc dl 111 mov [si+1],dl 112 pop dx 113 jmp inside 114 add_char: 115 push dx 116 mov dl,[si+2] 117 inc dl 118 mov [si+2],dl 119 pop dx 120 jmp inside 121 ends 122 end start
上面很多題目都涉及到了dos輸出,其實還挺有意思的。下面的代碼是把ax寄存器中保存的十六進制值打印出來的函數printf:
code segment start: mov ax,245 call printf mov ax,1234 call printf mov ax,2222 call printf mov ax, 4c00h int 21h printf proc near push cx push bx push dx mov cx,0 mov bx,10 disp1: mov dx,0 div bx ;如果除數是16位,AX儲存商,DX儲存余數 push dx inc cx or ax,ax jne disp1 ;ax!=0 then jump to disp1 disp2: ;stack top 2-4-5 stack bottom ,cx=3 means 3 elements in stack mov ah,2 pop dx add dl, 30H ;print :02h->32h ('2') 04h->34h ('4') 05h->35h ('5') int 21h loop disp2 call crlf pop dx pop bx pop cx ret printf endp crlf proc near push ax push dx mov dl,0ah mov ah,2h int 21h mov dl,0dh mov ah,2h int 21h pop dx pop ax ret crlf endp code ends end start
輸入一個小於100的正整數(兩位以內)用了input函數,關鍵在於指令aad:
code segment start: mov ax,0 call input mov ax,bx aad call printf mov ax, 4c00h ; exit to operating system. int 21h printf proc near push cx push bx push dx mov cx,0 mov bx,10 disp1: mov dx,0 div bx ;如果除數是16位,AX儲存商,DX儲存余數 push dx inc cx or ax,ax jne disp1 ;ax!=0 then jump to disp1 disp2: ;stack top 2-4-5 stack bottom ,cx=3 means 3 elements in stack mov ah,2 pop dx add dl, 30H ;print :02h->32h ('2') 04h->34h ('4') 05h->35h ('5') int 21h loop disp2 call crlf pop dx pop bx pop cx ret printf endp input proc mov bx,0 mov ah,1 ;first char int 21h sub al,30h mov bl,al mov ah,1 ;second char int 21h cmp al,0dh ;compare if al==Enter je exit sub al,30h mov cl,8 ;shift operation rol bx,cl mov bl,al jmp exit exit: call crlf ret input endp crlf proc near mov dl,0ah mov ah,2h int 21h mov dl,0dh mov ah,2h int 21h ret crlf endp ends end start