导航:首页 > 编程语言 > 8086子程序

8086子程序

发布时间:2023-05-21 12:09:40

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宏汇编语言中主程序和子程序之间为什么不能通过参数来传送数据

汇编很低级,如同在原始社会没汽车一样。主程序子程序有参数传递数据,那是高级语内言的时代了,参容数是通过进出栈来实现的,可在汇编里,一般是不会为几个数据进出子程序、另行再补充栈程序的。所以汇编里主程序和子程序传递参数可以是寄存器、或者指定的一片内存里。

阅读全文

与8086子程序相关的资料

热点内容
导出手机qq文件到u盘 浏览:456
电脑如何打开ppt文件怎么打开方式 浏览:782
魅族锁定区文件夹 浏览:357
刻字cnc怎么编程 浏览:182
学校的网络拓扑结构图 浏览:784
收集100个pdf文件里关键词 浏览:594
苹果关闭4g网络设置 浏览:289
如何监测数据库 浏览:967
拷贝过来的pdf文件 浏览:751
抖音小店的访客数据怎么看 浏览:670
怎么把c语言编程的字符向下移动 浏览:786
sql删除文件组代码 浏览:978
安卓post请求多重json 浏览:776
微信消除数据怎么恢复 浏览:918
小米刷机显示系统找不到指定文件 浏览:528
苹果手机小风扇图app叫什么 浏览:292
繁体中文输入工具 浏览:916
pc桌面壁纸文件夹 浏览:473
微信怎么添加群 浏览:781
40岁男人适合的微信名 浏览:925

友情链接