程式執行結果如下:
程式實現了十六位以內任意加數的相加運算
具體**如下:
data segment
msg1 db 「please input the first number:」,0dh,0ah,"$"
msg2 db 「please input the second number:」,0dh,0ah,"$"
rem db 「the reslut is:$」
n1_len dw 0
num1 db 100 dup(0)
n2_len dw 0
num2 db 100 dup(0)
data ends
code segment
assume
cs:code,ds:data
start:
mov dx,data
mov ds,dx
lea dx,msg1
mov ah,09
int 21h ;顯示第一句提示語
lea bx,num1 ;輸入第乙個數
call input ;呼叫input子程式
call crlf ;呼叫crlf子程式
lea dx,msg2
mov ah,09
int 21h ;顯示第二句提示語
lea bx,num2 ;輸入第二個數
call input
call adder
call crlf
lea dx,rem
mov ah,09
int 21h ;顯示結果提示語
lea bx,num1 ;此時num1中存放的是相加之後的結果
call show ;呼叫show子程式,顯示結果
call crlf
mov ah,4ch ;程式結束,返回dos
int 21h
crlf proc near ;回車換行
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
retcrlf endp
input proc near ;bx:陣列首位址,第乙個元素方長度
push ds
push ax
push dx ;暫存ds,ax,dx,ds中為資料段偏移位址,dx中為
;msg1偏移位址,ah=09
xor si,si ;si清零
inc si ;si自增1
next:
cmp si,100
je over ;比較si是不是100,如果是,則跳轉到over
mov ah,01 ;從鍵盤輸入乙個字元到al
int 21h
cmp al," "
je over ;判斷是否為空格?,如果是,則跳轉到over
cmp al,0dh
je over ;判斷是否為回車,如果是,則跳轉到over
cmp al,「0」 ;忽略其他字元
jb next ;判斷是否小於0,如果是,則跳轉到next
cmp al,「9」
ja next ;判斷是否大於9,如果是,則跳轉到next
sub al,30h ;轉換為十進位制
mov [bx+si],al ;初始時,si=1,將輸入的值存到記憶體中的[bx+1]
inc si ;si自增1
jmp next ;跳回next
over: ;如果輸入了空格或回車,則跳轉至此(預設已輸入完成)
dec si ;si自減1,之前一共輸入了si個字元
mov word ptr [bx-1],si;儲存長度 ;bx為num1的第乙個位元組
;首位址
pop dx
pop ax
pop ds ;恢復ds,ax,dx,ds中為資料段偏移位址,dx中為
;msg1偏移位址,ah=09
ret ;input子程式返回
input endp
show proc near
push ds
push ax
push dx ;暫存ds,ax,dx
mov cx,[bx-1] ;陣列長度,bx:陣列首位址,[bx-1]=[num1-1],獲取
;相加後結果的長度
xor si,si ;si清零
inc si ;si自增1
cmp byte ptr [bx+1],0
je more
nextshow:
mov ah,02
mov dl,byte ptr
[bx+si] ;輸出[bx+si]處的數字
add dl,30h ;轉換為ascii碼
int 21h
more:
inc si ;si自增1,指向下一位數字
loop nextshow ;初始時cx為結果的長度,cx=cx-1,
;如果cx≠0,則跳轉回nextshow
pop dx
pop ax
pop ds ;恢復dx,ax,ds
ret ;子程式返回
show endp
adder proc near;num1,num2分別是陣列的首位址,結果放到
;num1陣列中,進製cf
push ds
push ax
push dx ;暫存ds,ax,dx
mov si,word ptr [num1-1] ;si存放bx的長度 si存放第乙個
;數字的長度 [num-1]=[bx-1]
mov cx,si ;cx中為第乙個數字長度
mov di,word ptr [num2-1] ;di存放bp的長度,di存放
;第二個數字的長度 [num2-1]=[bx-1]
xor dl,dl ;dl清零,之前dx存放了msg2的偏移位址
cmp cx,di
jae continue ;比較兩個數字的長度,cx大於等於di,則跳轉
;到continue,cx存放兩個陣列中較大乙個的長度
mov cx,word ptr
[num2-1]
continue: ;如果cx大於等於di,則跳轉至此
add cx,1
mov word ptr
[num1-1],cx
continue1:
mov al,dl ;dl在之前已清零
xor dl,dl ;將dl清零
cmp si,0 ;初始時,si中是第乙個數字的長度
je la ;判斷si是否為0,如果是,則跳轉到la
add al,[num1+si] ;如果si不是0,將最後一位字元存入al
dec si ;si自減1,指向前一位數字
jmp lb ;跳轉到lb
la: ;如果si等於0,則跳轉至此
add al,0 ;al保持不變
lb:cmp di,0
je lc ;判斷di是否為0,如果是,則跳轉到lc,初始時,
;di中存放了第二個數字的長度
add al,byte ptr
[num2+di] ;如果di不為0,將第二個數字的
;最後一位加到al中
dec di ;di自減1,指向前一位數字
aaa ;此時第乙個數字和第二個數字的最後一位已相加存入
;al,若al>9,則al+6,ah+1,標誌位cf,af置1,al高四位清零,
;若al≤9,則標誌位cf,af置零
adc dl,0 ;若上一組數相加產生了進製,則cf置1,則
;dl=dl+0+cf將進製存到dl
jmp ld ;跳轉到ld
lc: ;如果di為0,則跳轉至此
add al,0 ;al保持不變
aaa ;判斷是否進製
adc dl,0 ;若進製,則存入dl
ld: ;如果di不為0,則跳轉至此
mov bx,cx ;bx中為第乙個數字的長度
結果數字的長度
mov [num1+bx],al ;將最後一位相加之後的結果存入num,
;代替原來最後一位的位置
loop continue1 ;初始時,cx中為第一位數字的長度,
;cx=cx-1,跳轉到continue,繼續上一位的相加,
pop dx ;cx=0時,繼續往下執行
pop ax
pop ds ;恢復dx,ax,ds
ret ;子程式返回
adder endp
code ends
end start
組合語言學習 實驗十五
安裝乙個新的int9中斷例程,功能 在dos下,按下 a 鍵後,除非不在鬆開,如果鬆開,就顯示滿螢幕的 a 其他的鍵照常處理。assume cs code code segment start sti 防止在設定中斷向量表之前出現有鍵盤輸入導致錯諉 mov ax,cs mov ds,ax mov s...
不大於五位數的對稱素數
定義乙個類,該類有乙個成員函式,能判斷其資料成員int dataint是否為對稱且不大於五位數的素數。測試類定義的正確性。輸入資料含有不多於50個的正整數 對於每個n,如果該數是不大於五位數的對稱素數,則輸出 yes 否則輸出 no 每個判斷結果單獨列出一行。11 101 272 yesyesno ...
彙編學習(十五)X86彙編學習 2 MBR為例
我們從 組合語言 的坑爬出來,又進入到了 實模式到保護模式 的坑中。mbr 計算機開機加電自檢之後,bios 就就嘗試讀取0面0道1扇區的內容,傳統上就是主引導扇區mbr共512b 以0x55 和 0xaa結尾。如下 mov ax,0xb800 指向文字模式的顯示緩衝區 mov es,ax 以下顯示...