1. 試用8086匯編語言編程,把ASCII表示的兩位十進制數,轉換成二進制數的子程序
;ascIItobinary
datasegment
a1db'87'
lendw$-a1
b1dw0
dataends
codesegment
assumecs:code,ds:data
start:
屬movax,data
movds,ax
leasi,a1
leadi,b1
movcx,len
callasc2bin
movax,4c00h
int21h
;si-sourceasciistring
;di-binary'svariable
;cx-ascii'slength
;
asc2binprocnear
movbl,10
L0:
movax,[di]
mulbl
movdl,[si]
anddl,0Fh
addal,dl
adcah,0
mov[di],ax
incsi
loopL0
ret
asc2binendp
codeends
endstart
2. 跪求8086/8088系統的匯編程序延遲一秒子程序
默認的時間中斷是每秒產生18.2次,如果要求不精確,就用18次時鍾中斷來延時一秒。
地址0:46c存放的就是這個計數器,可以讀取這個,然後加上18,比較就可以實現。代碼如下:
mov ax,0
mov ds,ax
mov si,46ch
lodsw
add ax,18
mov cx,ax
loc_1:
mov si,46ch
lodsw
cmp ax,cx
jnb loc_2
jmp loc_1
loc_2:
如果要求非常精確,那就要直接對定時器進行編程,通過埠操作來實現。
3. 使用8086匯編語言編寫程序
; 本程序在MASMPlus 1.2集成環境下通過編譯,經過調試,運行正確。
Code Segment
Assume CS:Code,DS:Code
; -------------------------------------
; 功能:顯示指定地址(Str_Addr)的字元串
; 入口:
; Str_Addr=字元串地址(要求在數據段)
; 用法: Output Str_Addr
; 用法舉例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -------------------------------------
; 功能:輸出一個字元
; 入口:dl=要顯示的字元
Output_Chr proc Near
push ax
mov ah,02h
int 21h
pop ax
ret
Output_Chr Endp
; -------------------------------------
; 功能:輸出回車換行
Output_CTLF proc Near
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
Output_CTLF Endp
; -------------------------------------
; 功能:把AX中的二進制無符號數轉換成顯式的十進制ASCII碼,並送顯示屏顯示
; 入口:AX=二進制數
; 出口:在當前游標位置顯示轉換後的ASCII碼數字
Dec_ASCII Proc Near
push ds
push cs
pop ds
push cs
pop es
push dx
push bx
push di
mov bx,10
lea di,@@Temp_Save[6]
mov BYTE ptr [di],'$'
dec di
cld
@@Divide: xor dx,dx
div bx
or dl,30h
mov [di],dl
dec di
test ax,0ffffh
jnz @@Divide
inc di
push di
pop dx
mov ah,9
int 21h
pop di
pop bx
pop dx
pop ds
ret
@@Temp_Save db 7 p(?)
Dec_ASCII EndP
; -------------------------------------
; 功能:把AL中的二進制無符號數作為小數轉換成顯式的十進制ASCII碼,
; 並送顯示屏顯示,未考慮四捨五入
; 入口:AH=二進制數,BH=除數,CX=保留小數位數
; 出口:在當前游標位置顯示轉換後的ASCII碼數字
Dec_Frac Proc Near
push ax
mov dl,'.'
call Output_Chr ;顯示一個小數點
pop ax
mov bl,10 ;乘數
@@Dec_Frac: mov al,ah ;余數不為0,處理小數部分
mul bl ;余數乘10,繼續做除法
div bh ;除以除數,取商數作為結果的一位小數
or al,30h
mov dl,al
call Output_Chr ;顯示一位小數
loop @@Dec_Frac
ret
Dec_Frac EndP
; -------------------------------------
SCORE db 76,69,84,90,73,88,99,63,100,80 ; 成績單
Elements equ ($-SCORE)/Type SCORE ;元素個數
RESULT db 6 p(0) ; 各分數段計數
prompt_Res db '00---59: $'
prompt_100 db '----100: $'
Press_Key db 7,13,10,13,10,'The complated. Press any key to exit...$'
Start: push cs
pop ds
push cs
pop es ;使數據段、附加段與代碼段同段
; -------------------------------------
; 統計低於60分,60~69分,70~79分,80~89分,90~99分和100分各分數段人數並顯示
lea si,SCORE ; 成績首地址
mov cx,Elements ;成績數目
mov dl,10 ; 用於除10
cld
@@Statics: lodsb ; 提取成績
xor ah,ah
div dl ; 除10
cmp al,5 ; >5,及格
jg $+4
mov al,5 ; <=5,不及格
sub al,5 ; 減5,分數段計數地址偏移量
cbw ;
push ax
pop bx
inc RESULT[bx] ; 計數增1
loop @@Statics ; 循環,統計下一個成績
mov bl,59h
mov cx,5
lea si,RESULT ;各分數段計數數組首地址
lea dx,prompt_Res ; 統計結果字元串地址
List_Res: mov ah,9 ;顯示分數段提示信息
int 21h
lodsb ;讀入計數值
xor ah,ah
call Dec_ASCII ; 顯示統計結果
call Output_CTLF ;輸出一個回車、換行
mov al,bl
inc al
daa
mov bl,al
push cx
mov cl,4
xor ah,ah
shl ax,cl
shr al,cl
or ax,3030h
xchg ah,al
mov WORD ptr Prompt_Res,ax
mov al,bl
add al,9
mov bl,al
xor ah,ah
shl ax,cl
shr al,cl
or ax,3030h
xchg ah,al
mov WORD ptr Prompt_Res[5],ax
pop cx
loop List_Res
Output prompt_100 ;提示顯示100分的人數
lodsb ;讀入100分計數值
xor ah,ah
call Dec_ASCII ; 顯示統計結果
; -------------------------------------
Exit_Proc: Output Press_Key ;提示操作完成,按任意鍵結束程序
mov ah,1
int 21h
mov ah,4ch ;結束程序
int 21h
Code ENDS
END Start ;編譯到此結束
4. 8086的中斷服務子程序 在哪
中斷服務子程序入口地址保存在0:0~400h,每個中斷服務子程序入口地址佔4個位元組(雙字),共可保存256個中斷向量。段地址為0,偏移地址地址=中斷向量號x4
如int
10h,其入口地址為:10hx4=40h,即0:40h
5. 比較8086 cpu子程序調用和執行中斷服務操作的異同
8086CPU的中斷系統具有256個中斷,每個中斷用一個唯一的中斷向量號標識。向量號也稱為矢量號或類型號,它用一個位元組表示:0——255,對應256個中斷。8086的中斷可以分成外部中斷和內部中斷兩類。
(1)外部中斷
外部中斷是來自8086CPU之外的原因引起的程序中斷。它又分成兩種情況:
·可屏蔽中斷——外部的這個中斷請求可以在CPU的內部被屏蔽掉,即CPU可以控制它是否引起程序中斷。標志寄存器中的中斷允許標志IF就是用於控制可屏蔽中斷的。
·非屏蔽中斷——外部的這個中斷請求不能在CPU的內部被屏蔽,CPU必須執行它的處理程序。8086為非屏蔽中斷分配了中斷向量號02。
(2)內部中斷
內部中斷是由於8086CPU內部執行程序引起的程序中斷。它又分成多種情況:
·除法錯中斷——在執行除法指令時,若除數為0或商超過了寄存器所能表達的范圍,則產生除法錯中斷。8086為它分配的向量號為0。
·指令中斷——執行中斷調用指令INTn就產生指令中斷,也稱為軟體中斷,它的向量號就是n。
INTn指令為2位元組指令(機器碼為11001101—n—,第2個位元組就是中斷向量號n),但向量號為3的指令中斷(INT3)是1位元組指令(11001100),較特殊,常用做程序調試的斷點中斷。
調試程序DEBUG中的G命令就是利用斷點中斷(3號中斷)中止被調試程序的。使用DEBUG調試程序時,如果在程序段最後加上一條INT3指令,就可以停止程序運行,而不必設置斷點了。
·溢出中斷——在執行溢出中斷指令INTO時,若溢出標志OF為1,則產生溢出中斷。它的向量號為4。
·單步中斷——若單步標志TF為1,則在每條指令執行結束後都產生單步中斷。它的向量號為1。
調試程序DEBUG中的T命令就利用了單步中斷。
6. 用8086匯編語言,編寫延時子程序
該程序的延時時間,請樓主按以下介紹方法及的資料自行計算:
(1)時鍾周期回 T = 1/(2.2x10^9) ≈ 0.45 ns ,
(2)延時答時間 = ∑(數據訪問時間+指令執行時間)
(3)常用指令執行的時間及各種定址方式所用時間見下表(點擊可顯示大圖):
7. 8086宏匯編語言中主程序和子程序之間為什麼不能通過參數來傳送數據
匯編很低級,如同在原始社會沒汽車一樣。主程序子程序有參數傳遞數據,那是高級語內言的時代了,參容數是通過進出棧來實現的,可在匯編里,一般是不會為幾個數據進出子程序、另行再補充棧程序的。所以匯編里主程序和子程序傳遞參數可以是寄存器、或者指定的一片內存里。