題目:從鍵盤讀入兩個一位十六進製制數,根據條件,以十六進製制輸出計算結果
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 實際列印出來的...