新版組合語言程式設計課後答案

2022-10-18 14:21:08 字數 6029 閱讀 5754

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應用程式開發時,需要庫檔案,執...