彙編作業(2006 5 10)

2021-04-07 01:45:59 字數 2548 閱讀 4789

題目:計算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 實際列印出來的...