彙編作業(2006 5 3)

2021-04-07 01:45:59 字數 4003 閱讀 3071

題目:從鍵盤讀入兩個一位十六進製制數,根據條件,以十六進製制輸出計算結果

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', '$'  ; 檢測輸入是否為有效數字的儲存列表

str1 db 'input x: $'

str2 db 0ah, 0dh, 'input y: $'

str3 db 0ah, 0dh, 'choose [a], [b], [c] or [d]: $'

str4 db 0ah, 0dh, 'error! your input is invalid!$'

str5 db 0ah, 0dh, 'the result is: $'

data ends

code segment

assume cs:code, ds:data

begin: mov ax, data

mov ds, ax

mov dx, offset str1  ; 提示資訊

mov ah, 09h

int 21h

mov ah, 01h

int 21h

mov di, offset list  ; 取出list的偏移量

mov bl, 46h   ; 令bl為46h(字元f的ascii碼值)

lop1: cmp al, [di]   ; 將讀入的字元與儲存列表逐個比較

je next1   ; 若有效,則跳轉

cmp [di], bl   ; 已經比較至f(列表尾部),即輸入的是無效字元

je error1   ; 跳轉至錯誤資訊

inc di    ; di加1,指向列表中下乙個字元

loop lop1    ; 新一輪迴圈

error1: mov dx, offset str4  ; 錯誤資訊

mov ah, 09h

int 21h

jmp over

next1: cmp al, 39h   ; 比較輸入的字元是否為0~9

ja next2   ; 若為a~f則跳轉

and al, 0fh   ; 否則遮蔽高4位(將ascii碼還原成數字)

mov x, al   

jmp next3   ; 跳轉

next2: sub al, 07h   ; 輸入為a~f,則將讀入的ascii碼減去7

and al, 0fh   ; 遮蔽高4位(將對應的ascii碼還原成字母)

mov x, al   ; x值獲取結束,存入變數

next3: mov dx, offset str2  ; 以下為獲取y的值,與上面獲取x的步驟相同

mov ah, 09h

int 21h

mov ah, 01h

int 21h

mov di, offset list  

mov bl, 46h   

lop2: cmp al, [di]

je next4

cmp [di], bl

je error2

inc di

loop lop2

error2: mov dx, offset str4

mov ah, 09h

int 21h

jmp over

next4: cmp al, 39h

ja next5

and al, 0fh

mov y, al

jmp next6

next5: sub al, 07h

and al, 0fh

mov y, al   ; y值獲取結束,存入變數

next6: mov dx, offset str3  ; 提示資訊

mov ah, 09h

int 21h

mov ah, 01h

int 21h

cmp al, 41h   ; 若輸入為41h(字元a的ascii碼值)

je case1   ; 則跳轉

cmp al, 42h   ; 若輸入為42h(字元b的ascii碼值)

je case2   ; 則跳轉

cmp al, 43h   ; 若輸入為43h(字元c的ascii碼值)

je case3   ; 則跳轉

cmp al, 44h   ; 若輸入為44h(字元d的ascii碼值)

je case4   ; 則跳轉

error3: mov dx, offset str4  ; 否則,顯示錯誤資訊

mov ah, 09h

int 21h

jmp over

case1: mov al, x   ; 二者相加

add al, y

jmp cal    ; 跳至cal處進行處理

case2: mov al, x   ; 二者相減的絕對值

cmp al, y   ; 比較x,y的大小

jb case2_a   ; 若x < y,則跳轉

sub al, y   ; 否則用x減y

jmp cal    ; 跳至處理部分

case2_a: mov x, al  ; 此時x < y

mov al, y  

sub al, x  ; 用y減x

jmp cal   ; 跳轉

case3: mov al, x   ; 二者相乘

mov bl, y

mul bl

jmp cal    ; 跳轉

case4: and ah, 00h   ; 首先遮蔽ah部分,避免干擾

mov al, x   

mov bl, y

div bl    ; x除以y,商在al中,餘數在ah中

jmp special   ; 由於其特殊性,不能直接跳至cal處

cal: mov ah, al  ; 令高8位等於低8位

and ah, 0f0h  ; 遮蔽ah的低四位(保留十位數字)

mov cl, 4  ; cl為右移位數

shr ah, cl  ; 邏輯右移4位,使得ah的低四位變為高四位,高四位置0

and al, 0fh  ; 遮蔽al低四位(保留個位數字)

special: cmp al, 0ah  ; 判斷al與0ah的關係

jb casea  ; 如果al < 0ah,則跳轉到case_1a

add al, 07h  ; 否則將al加上07h**到字母所對應的ascii碼)

casea:  mov di, offset z  ; 把y的偏移量賦給di

add di, 1   ; di加1,指向y的高位址部分(y有兩個位元組)

add al, 30h   ; 將al加30h使數字對應上相應的ascii碼

mov [di], al   ; 把al的值賦給di所指向的位址

dec di    ; di減1(向低位址移動1個位元組)

cmp ah, 0ah   ; 判斷ah與0ah的關係

jb caseb   ; 如果ah < 0ah,則跳轉到case_1b

add ah, 07h   ; 否則將ah加上07h**到字母所對應的ascii碼)

caseb:  add ah, 30h   ; 將ah加30h使數字對應上相應的ascii碼

mov [di], ah   ; 把ah的值賦給di當前所指向的位址

show: mov dx, offset str5  ; 顯示提示資訊和結果

mov ah, 09h

int 21h

mov dx, offset z

mov ah, 09h

int 21h

mov dl, 'h'  

mov ah, 02h

int 21h

over: mov ah, 4ch   ; 中止

int 21h

code ends

end begin 

彙編作業(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 10)

題目 計算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 d...

彙編作業(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 實際列印出來的...