2.13; (1)
;不考慮進製mov bl,al
mov cl,3
shl al,cl
add al,bl ;shl bl,1
add al,bl
;考慮進製xor ah,ah
mov bx,ax
mov cl,3
shl ax,cl
add ax,bx ;shl bx,1
add ax,bx
(2)數字0~9的ascii碼是:30h~39h
非壓縮bcd碼的0~9是:00h~09h
方法一:
and al,0fh ;實現ascii到非壓縮bcd碼的轉換
or al,30h ;實現非壓縮bcd碼到ascii的轉換
方法二:
xor al,30h;求反d5d4位,其他不變
;即高4位為3,則變為0;高4位為0,則變為3
mov cl,4
again: shr dx,1 ;實現邏輯右移
;採用「sar dx,1」,則實現算術右移
rcr ax,1
dec cl
jnz again
2.14; (1)用sar編寫
mov al,0f7h ;-9送al
sar al,1 ;結果:al=0fbh即-5
(2)用idiv編寫
mov al,0f7h;-9送al
cbw ;位元組符號擴充套件位字
mov bl,2 ;注意除數不可為立即數
idiv bl;結果:商為al=fch (-4)
; 餘數為ah=ffh (-1)
結論:符號數的除法用idiv 準確
2.19;
短轉移:指段內-128~127之間的轉移,位移量用乙個位元組表示
近轉移:指段內±32k之間的轉移,位移量用乙個字表示
遠轉移:指段間1mb範圍的轉移
段內轉移:指在同乙個**段內的轉移,可以是短轉移或者近轉移
段間轉移:指轉移到另外乙個**段,就是遠轉移
8086/8088cpu的jmp、call和int n指令可以實現段間轉移
第2章(04)
2.20; 8086的條件轉移的轉移範圍:在當前指令位址的 +127---- -128之內。
如條件轉移的轉移範圍超出此範圍,可在此範圍內安排一條無條件轉移,再轉移到範圍外的目標位址。
2.21; (1)jmp bx;轉移的有效位址ea=bx=1256h
(2)jmp table[bx] ;轉移的有效位址ea=[ds:20a1h+1256h]=[232f7]=3280h
(3)jmp [bx][si];轉移的有效位址ea=[ds:1256h+528fh]=264e5h=2450h
2.22; (1) xor ax,1e1eh
je equal
;ax=1e1eh(異或後為0)
(2)test al,10000001b
jnz there
;al的d0或d7至少有一位為1
(3) cmp cx,64h
jb there
;cx(無符號數)< 64h
2.23;
mov cx,0不迴圈,因為一進入迴圈就判 cx=0? 如cx=0 就退出迴圈
delay:loop delay
2.24; (1)若dx > di,轉到above執行
cmp dx,di
ja above;=jnbe above
(2)若ax > si,轉到greater執行
cmp ax,si
jg greater;=jnle greater
(3)若cx = 0,轉到zero執行
cmp cx,0 jcxz zero
jz zero
(4)若ax-si產生溢位,轉到overflow執行;
cmp ax,di
jo overflow
(5)若si≤ax,轉到less_eq執行;
cmp si,ax
cmp ax,si
jle less_eq
jge less_eq
(6)若di≤dx,轉到below_eq執行。
cmp di,dx
cmp dx,di
jbe below_eq
jae below_eq
2.25; 答:將首位址為array得20個字的陣列求和,並將結果存入 total 單元中。
第2章(05)
2.26; (1)
mov si,0
mov dl,string[si];第1個字元送dl暫存器
mov si,5
mov dh,string[si];第6個字元送dh暫存器
(2) xor si,si;si清零
mov al,buffer[si];第一位元組
inc si
mov ah,buffer[si];第二位元組
mov cl,4
shl ah,cl;bcd碼移到高半位元組
or al,ah;組合成壓縮bcd碼
mov dl,al;存入dl寄..
inc si
mov al,buffer[si];第三位元組
inc si
mov ah,buffer[si];第四位元組
mov cl,4
shl ah,cl;bcd碼移到高半位元組
or al,ah;組合成壓縮bcd碼
mov dh,al;存入dh寄..
(3)test dx,0f000h
jz zero
mov ax,-1
jmp done
zero: mov ax,0
done: ret
(4)lea bx,buffer1
lea dx,buffer2
mov cx,8;8個位元組
xor si,si;si=0
clc;cf=0
(5)mov ax,0b800h
mov ds,ax;段位址
xor si,si;位址偏移量si=0
xor dx,dx;和的高字dx=0
mov cx,99;加的次數
mov ax,[si];第乙個數
again: inc si;指向下乙個字單元
inc si
add ax,[si];加下乙個數
jnc noc;無進製轉
inc dx;有進製dx=dx+1
noc: dec cx;次數-1
jnz cx,again;非0繼續加
ret(6)mov si,offset string
mov cx,8000h;32k=2^15=8000h
again: cmp [si],』$』
jnz next
mov [si],20h;if [si]=』$』 [si]<-- 』 』
next: inc si
loop again
(7)xor si,si;si<--0
mov cx,100;迴圈次數
again: dec array[si]
dec cx
jnz again
(8)xor si,si ;si<--0
coun: cmp string[si],』$』
je done
inc si
jmp coun
done: ret
2..27; (1)使cf=0 : clc; and ax,ax;or ax,ax
(2)使ax=0 : xor ax,ax; and ax,0;mov ax,0
(3)同時使ax=0和cf=0: and ax,0 ;xor ax,ax ;sub ax,ax
2.29; 壓縮bcd碼加法:ax←ax+bx
出口引數:ax=bcd碼和
2.24; okmsg db 『ok』, 『$』errmsg db 『error ! overflow
mov ax,x
sub ax,y
jo overflow
mov dx,offset okmsg
jmp next
overflow: mov dx,errmsg
next: mov ah,9
int 21h
錯誤:mov ax,x
sub ax,y
jo overflow
mov dx,offset okmsg
okmsg db 『ok』, 『$』
mov dx,errmsg ;錯誤1:資料定義在**中
mov ah,9
int 21h
overflow: errmsg db 『error ! overflow !』, 『$』
mov dx,errmsg ; 錯誤2:缺少jmp指令
mov ah,9
int 21h
2.37; ;
.model small
.stack
.data
array db 255
db 0
array1 db 255 dup('$')
array2 db 0dh,0ah,'$'
.code
.startup
mov ah,0ah ; 鍵盤輸入字串
mov dx,offset array
int 21h
mov dx,offset array2 ; 回車換行
mov ah,09h
int 21h
mov bx,offset array1
again: mov al,[bx]
cmp al,'$'
jz done
cmp al,'a' ; 小於a和大於z的字元不是小寫字母
jb next
cmp al,'z'
ja next
sub al,20h ; 在a和z之間的字元才是小寫字母,轉換為大寫
mov [bx],al ; 儲存到原位置
next: inc bx
jmp again
done: mov dx,offset array1
mov ah,09h
int 21h
.exit 0
end 第三章(01)
3.1; 硬指令:每個硬指令就是乙個處理器指令,在cpu執行時產生相應功能;
偽指令:偽指令並不產生處理器指令,它通常用於輔助匯程式設計序對源程式進行彙編。
3.2;
3.5; ⒈編輯文字編輯程式組合語言源程式.asm
⒉彙編匯程式設計序目標模組檔案.obj
⒊連線連線程式可執行檔案.exe或.com
⒋除錯除錯程式應用程式
3.6; ;簡化段定義格式
.model small ;定義程式的儲存模式(小模式)
.stack;定義堆疊段(預設1024個位元組)
.data;定義資料段
str1 ab 』input number:0~9 : 』,0dh,0ah,』$』
str2 ab 』error!』,0dh,0ah,』$』
.cade;定義**段
.startup;說明程式的起始點,建立ds,ss的內容。
mov ah,09h;顯示str1字串
mov dx,offset str1
int 21h
gtekey: mov ah,1;呼叫bios判斷按鍵功能
int 16h
jz getkey;如 zf = 0,無鍵按下,等待
cmp al,『0』;有鍵按下,鍵值與『0』比較
jb error;如 < 『0』,出錯處理
cmp al, 『9 』;有鍵按下,鍵值與 『9』比較
ja error;如 〉『9』,出錯處理
mov ah,02h;呼叫dos顯示字元功能,顯示該數字
mov dl,al
int 21h
.exit 0;終止程式執行,返回dos
error: mov ah,09h; 出錯,呼叫dos 功能顯示str2字串
mov dx,offset str2
int 21h
jmp getkey;等待按鍵
end; 彙編結束
組合語言程式設計
實驗報告 軟體學院 一 實驗目的與意義 理解並熟練掌握組合語言程式設計過程中的編輯 彙編 鏈結和除錯等各個步驟,提高對彙編課程內容的理解和組合語言的掌握,通過上機練習加深對課程內容的理解和掌握。通過組合語言編制的程式上機除錯 執行檢驗程式設計是否正確。熟悉和掌握編輯 彙編 連線和除錯四個實用程式的使...
三組合語言程式設計
軟體要求 win98或win2000 masm5.0或masm6.0 含masm link debug等程式 硬體要求 ibm pc及相容機 實驗一非壓縮bcd碼乘法 一 實驗目的 學習程式設計的基本方法和技能,熟練掌握用組合語言設計 編寫 除錯和執行程式的方法。為後續課程打下堅實的基礎。同時熟練掌...
組合語言程式設計A卷
2011級組合語言程式設計課程試題 a卷 合分人複查人 1 用組合語言書寫的程式叫做masm要求該檔案的副檔名是編寫32位windows應用程式應選擇儲存模型。2 組合語言語句有兩種,分別是和3 除外設資料外的資料定址方式有3類,分別稱為 和定址。4 進行windows應用程式開發時,需要庫檔案,執...