8086的编程问题(使用汇编语言)

1,编码两个通用过程完成AX中存储的二进制数转换成压缩BCD码和BCD码转换成二进制数。

;这个程序通过编译正确运行。

代码段

假设CS:Code,DS:Code

;-

;功能:将AX中的二进制数转换成压缩的BCD码。

;条目:AX=16位二进制数(因为最大压缩BCD码是9999H,所以AX的二进制值不能大于270FH)。

;Exit: AX=转换后压缩的BCD码。

Binary_BCD Proc Near

推送dx

推送cx

推送bx

推di

mov @@Temp_Save,0

mov @@Temp_Save[2],0;将临时双字存储单元设置为0。

mov bx,10

lea di,@@Temp_Save[3]

cld

@@Divide: xor dx,dx

分部bx

mov [di],dl;保存剩余部分

十二月二日

测试ax,0ffffh

jnz @ @除

mov cl,4

mov ax,@@Temp_Save[2]

xchg ah,al

shl al,cl

化学发光二极管

mov dl,啊

移动轴,@@Temp_Save

xchg ah,al

shl al,cl

化学发光二极管

运动al,dl

波普迪

pop bx

流行cx

流行dx

浸水使柔软

@@Temp_Save dw 2 dup(?)

Binary_BCD EndP

;-

;功能:将AX中压缩的BCD码转换成二进制数。

;条目:AX=压缩BCD码

;退出:AX= 16转换后的二进制数。

BCD_Binary Proc Near

推送dx

推送cx

推动bx

mov dx,ax

mov bx,10

mov cl,4

嘘啊,cl

xchg ah,al

字节扩展为字

推送dx

多重bx

流行dx

和dh,0fh

xchg dh,dl

推送dx

异或dh,dh

添加ax,dx

多重bx

流行dx

xchg dh,dl

异或dh,dh

推送dx

shr dx,cl

添加ax,dx

多重bx

流行dx

和D1,0fh

添加ax,dx

pop bx

流行cx

流行dx

浸水使柔软

BCD_Binary EndP

;-

开始:推送cs

流行数码相机

推送cs

pop es使数据段、附加段和代码段成为同一个段。

mov ax,3456

调用Binary _ BCD将AX中的二进制数转换成压缩的BCD码

调用BCD _ Binary将AX中压缩的BCD码转换成二进制数。

Exit_Proc: mov ah,4ch结束程序

int 21h

代码结束

结束开始;这是编译的结尾

2.附加段中有一个数组,第一个地址是BUFF,数组中的第一个字节存储数组的长度。写个程序在数组中找0,找到后从数组中删除,后续项向前压缩,剩下的用0填充。

;这个程序通过编译正确运行。

代码段

假设CS:Code,DS:Code

BUFF db 10,56,78,35,0,89,51,63,0,76,123

开始:推送cs

流行数码相机

推送cs

pop es使数据段、附加段和代码段成为同一个段。

cld

lea si,BUFF数组头地址→si

lodsb读取数组长度

异或啊,啊

推斧

pop cx数组长度→cx

find _ Zero:lodsb;数组元素被读入累加器a1

cmp al,0;是0吗?

jnz Next _ One不为0,跳到下一个元素。

;-

;找到0,从数组中删除,后续项向前压缩,其余用0填充。

推送si

波普迪

十二月二日

推di

推送cx

十二月cx

代表movsb

mov字节指针[si-1],0

流行cx

波普斯

;-

Next_One:循环Find_Zero

Exit_Proc: mov ah,4ch结束程序

int 21h

代码结束

结束开始;这是编译的结尾

3.编写一个程序统计学生的数学成绩,将学生分为90 ~99分、80 ~89分、70 ~79分、60~69分、60分以下,并将每一节的人数发送到内存单元。

;这个程序通过编译正确运行。

代码段

假设CS:Code,DS:Code

;-

;功能:输出回车和换行

进入CTLF附近

推斧

推送dx

mov ah,02h

mov dl,0dh

int 21h

mov dl,0ah

int 21h

流行dx

爆破筒

浸水使柔软

进入_CTLF终点

;-

;函数:将AL中的二进制无符号数转换成显式的十进制ASCII码。

;条目:AL=二进制数;Di=转换后的ASCII存储地址。

;退出:无

Dec_ASCII Proc附近

推送si

推送cx

推动bx

推di

mov bl,10

异或cx,cx

lea di,@@Temp_Save[3]

cld

@@Divide: xor啊,啊

div bl

或者啊,30h

mov [di],啊

十二月二日

inc cx

测试铝,0ffh

jnz @ @除

推di

波普斯

公司si

波普迪

pop bx

推di

代表movsb

mov字节指针[di],' $ '

波普迪

流行cx

波普斯

浸水使柔软

@@Temp_Save db 4 dup(?)

Dec_ASCII EndP

;-

得分db 56,69,84,82,73,88,99,63,100,80,0,10,80,100,90,73,43,60,63,72,88,42,58,99,100,89,65,61,74,84,79学校报告;副本

元素equ($-分数)/类型分数;元素数量

score _ Tab db 6 dup(0);每个分数段的计数

结果数据库' 00 - 59:'

Temp_STr db 4 dup ('$ ')

Score100 db '====100:'

开始:推送cs

流行数码相机

推送cs

pop es使数据段、附加段和代码段成为同一个段。

cld

lea si,得分;年级第一个地址

mov cx,元素;成就数量

mov dl,10;用来除10。

read _ Score:lodsb;提取结果

div dl10除外

cmp al,5;& gt5、通过考试

jg $+4

mov al,5;& lt=5,失败

sub al,5;负5,小数段计数地址偏移量。

cbw

推斧

pop bx

Inc Score _ Tab[bx];计数增加了1

循环Read _ Score循环计数下一个结果。

;显示统计结果

mov bl,59h

mov cx,5

lea si,Score _ Tab每个片段计数数组的第一个地址

lea di,临时字符串

lea dx,Resault统计结果字符串地址

列表结果:

lodsb读入计数值

调用Dec_ASCII

mov啊,9;显示统计结果

int 21h

呼叫CTLF中心

电影al,bl

添加al,1

daa

mov bl,al

推送cx

mov cl,4

异或啊,啊

化学发光二极管

施拉尔,cl

或ax,3030h

xchg ah,al

移动字指针结果,ax

电影al,bl

添加al,9

mov bl,al

异或啊,啊

化学发光二极管

施拉尔,cl

或ax,3030h

xchg ah,al

mov字指针结果[5],ax

流行cx

循环列表_结果

推送si

推di

蕾斯,得分100

莱娅·迪·雷索尔

lea cx,临时字符串

子cx,di

代表movsb

波普迪

波普斯

lodsb读入计数值

调用Dec_ASCII

mov啊,9;显示统计结果

int 21h

Exit_Proc: mov ah,4ch结束程序

int 21h

代码结束

结束开始;这是编译的结尾