彙編學習 十五位數的加法運算

2021-10-04 01:14:57 字數 4327 閱讀 5436

程式執行結果如下:

程式實現了十六位以內任意加數的相加運算

具體**如下:

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 以下顯示...