題目:計算x的n次方,x與n為從鍵盤讀入的十進位制數,結果以十六進製制輸出
源程式:
data segment
str1 db 'input x(1~5): ', '$'
str2 db 0ah, 0dh, 'input n (1~5): ', '$'
str3 db 0ah, 0dh, 'the result is: ', '$'
x db 0
n db 0
y db 4h dup(0), '$'
data ends
stack segment para stack
dw 20h dup(0)
stack ends
code segment
assume cs:code, ds:data, ss:stack
begin: mov ax, data
mov ds, ax
call input ; 呼叫輸入子程式
mov ah, 0h
mov al, x ; 把x存入ax中
call pow ; 呼叫求n次方子程式
mov ah, 0h
mov al, 0h
call output ; 呼叫輸出子程式
jmp over
input proc
mov dx, offset str1
mov ah, 09h
int 21h
mov ah, 01h
int 21h
cmp al, 31h ; 判斷輸入的有效性
jb to
cmp al, 35h
ja to
mov x, al
and x, 0fh
jmp next
to: jmp over ; 跳轉中轉(ja,jb無法直接跳到over處,超出範圍了)
next: mov dx, offset str2
mov ah, 09h
int 21h
mov ah, 01h
int 21h
cmp al, 31h
jb over
cmp al, 35h
ja over
mov n, al
and n, 0fh
ret ; 函式返回
input endp
pow proc
cmp x, 01h ; 如果x為1,則不管n,結果都為1
jg next1
mov bx, 01h ; 結果存入bx中
retnext1: cmp n, 0h ; 遞迴最簡條件,n為0時,結果為1
jg next2
mov bx, 01h
ret
next2: push ax ; 把ax壓入堆疊(暫存x)
dec n ; n減1
call pow ; 呼叫本身(開始遞迴)
pop ax ; 彈出ax(彈出暫存的x)
mov dx, 0h ; dx清0
mul bx ; bx(儲存函式返回結果的暫存器)與ax(暫存暫存器)相乘
mov bx, ax ; 結果再次儲存至bx(遞迴用)
retpow endp
output proc
mov dx, offset str3
mov ah, 09h
int 21h
mov di, offset y
add di, 3 ; 置di指向y的高位址(最後乙個位元組)
mov ax, bx ; 把bx儲存的最終結果複製到ax中乙份(暫存)
mov cl, 4 ; 移位位數
lop: mov bh, 0h ; 保留bx最低4位
and bl, 0fh
cmp bl, 0ah ; 與0a比較,處理ascii碼轉換問題
jb next3
add bl, 07h
next3: add bl, 30h ; 變換成對應的ascii碼
mov [di], bl
cmp di, 0 ; 若di已經指向y首位址(全部寫入完畢),則跳出
je next4
dec di
mov bx, ax ; 把暫存的bx取出,重新賦予bx
shr bx, cl ; 邏輯右移4位,即依次取得4位資料
add cl, 4 ; 移位位數依次加4
loop lop
next4: mov dx, offset y
mov ah, 09h
int 21h
mov dl, 'h'
mov ah, 02h
int 21h
retoutput endp
over: mov ah, 4ch
int 21h
code ends
end begin
由於考慮到結果的位數問題,只好把x與n的取值縮小的1~5之間,否則如果結果超出了4位十進位制數(超出ax的表示位數)的話,我不知道該怎麼儲存了,不知道這樣老師會不會罵我。。。
彙編作業(2006 5 3)
題目 從鍵盤讀入兩個一位十六進製制數,根據條件,以十六進製制輸出計算結果 a 計算x y b 計算 x y c 計算x y d 計算x y 源程式 data segment x db y db z db 2 dup 0 list db 0123456789abcdef 檢測輸入是否為有效數字的儲存列...
彙編作業(2006 5 9)
要求 鍵盤輸入1 9,根據輸入列印含有 的三角陣型,比如輸入為3,第一行列印乙個 第二行列印3個 第三行列印5個 要求每行中間的 在同一列上。依此類推。源程式 data segment str db input number of the lines from 1 to 9 endl db 0ah,...
彙編作業(2006 5 19)
data segment x db 5,5 dup 0 xx dw 0 將x完成拼接操作存入xx 將xx當作要被轉換的資料處理 y db 5 dup 0 存轉換後的10進製數 str1 db input 4 digits str2 db 0ah,0dh,the bcd code is 實際列印出來的...