微机原理的编程问题 急!!!100分!

作者&投稿:漕卓 (若有异议请与网页底部的电邮联系)
高分急求 微机原理及接口技术 编程题答案(100分再追加100分!!)~

哥们儿,这不是考试题吗?豆丁网有,自己下去
不过你们老师没教过吗?

愿意给分吗?谢谢,(*^__^*) 嘻嘻……

1. mov cx,bx
2. mov bl,al
or bl,0F0H
shr bl,4
call ascii
mov ASC,bl
mov bl,al
or bl,0fH
call ascii
mov ASC+1,bl
3.mov cx,100
mov bx,N
mov dx,M
begin:
mov al,[bx]
inc al
mov [dx],al
inc bx
inc dx
loop begin
4.mov bx,N
mov dx,'$'
mov cx,0
begin:
mov ax,[bx]
cmp ax,dx
je next
inc cx
inc bx
jmp begin
next:
mov dx,M
mov [dx],cx
5.
mov dx,046H
mov al,11010100B
out dx,al
6.mov dx,034H
begin:
in al,dx
or al,10000B
je zero
mov al,0ffH
out 035H,al
jmp begin
zero:
mov al,0
out 035H,al
jmp begin
7.
mov dx,087H
mov al,10010110B
out dx,al

可能有小错误,请多指教

DATA SEGMENT ;定义数据段
BUF DB -3,1,2.... ;定义变量
BUF1 DB 1000 DUP(?) ;预留1000字节的空间
DATA ENDS ;数据段定义结束
CODE SEGMENT ;定义代码段
ASSUME CS:CODE,DS:DATA ;段寄存器关联说明
START: ;代码段第一条指令从这里开始
MOV AX,DATA ;数据段段址→ax
MOV DS,AX ;ax→ds,给数据段段寄存器赋值
LEA SI,BUF ;变量BUF有效地址→SI
MOV CX,1000 ;变量BUF元素个数→CX
MOV AX,[SI] ;变量BUF的第一个字数据→AX
LP: CMP AL,0 ;AL<0?
JL NEXT ;是,转NEXT处执行
INC SI ;变量BUF元素地址增1
DEC CL ;CL-1→CL
JNZ LP ;CL不等于0,转LP处执行循环体
NEXT: MOV BUF1,AL ;AL送变量BUF1保存
MOV AH,4CH ;结束程序
INT 21H ;dos功能调用
CODE ENDS ;代码段定义结束
END START ;编译到此结束

程序段功能: 从变量BUF的1000个有符号字节数种找到第一个负数,把这个负数存于BUF1单元。

从程序段来看,这段程序的编者必是初学汇编语言。提两点建议:

1、有一处错误:
DEC CL
从程序功能来看,此处必须要用:
DEC CX
因为你要从1000个有符号字节数中找出第一个负数,而8位计数器CL能存的最大无符号数是255,那么用指令:
DEC CL
实际上是只从前255个元素中查找,而漏掉了后面的745个元素。如果前255个元素中没有负数,执行结果必然是错误的。

2、Intel 8086/8088体系结构的内存管理是分段式的,教科书及老师都习惯于这种模式,这是正确的。但我们作为初学,只是练习,无论是数据量还是代码量,都很有限,没有必要分这个段、那个段的,完全可以在一个段里进行,即把DS、ES及SS,统统地设置成与代码段同段。下面,以另一种方式来实现这个功能,仅供参考。
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE
BUF DB -3,1,2....
Element equ ($-BUF)/type BUF ;元素个数
BUF1 DB ?
START:push cs
pop ds
push cs
pop es
lea si,BUF
mov cx,Elements
LP: lodsb
cmp al,0
jl $+4
loop LP
MOV BUF1,AL
MOV AH,4CH
INT 21H
CODE ENDS
END START

DATA SEGMENT;定义数据段
BUF DB -3,1,2.... ;程序预置的初始数据
BUF1 DB 1000 DUP(?) ;程序预留的1000字节数据存放区
DATA ENDS ;数据段定义结束
CODE SEGMENT ;定义代码段
ASSUME CS:CODE,DS:DATA ;段寄存器关联说明
START: ;代码段第一条指令从这里开始
MOV AX,DATA ;数据段段址→ax
MOV DS,AX ;ax→ds,给数据段段寄存器赋值
LEA SI,BUF ;取BUF偏移到SI
MOV CX,1000 ;令CX=1000
MOV AX,[SI] ;从当前数据段,SI指向的内存,取一字型数据到AX
LP: CMP AL,0 ;AL与0相比较
JL NEXT ;小于0,转标号NEXT:执行
INC SI ;SI加上1
DEC CL ;CL减去1
JNZ LP ;CL不等于0,转向标号LP:执行
NEXT: MOV BUF1,AL ;AL送入变量BUF1首地址
MOV AH,4CH ;结束程序
INT 21H ;dos功能调用
CODE ENDS ;代码段定义结束
END START ;编译到此结束

程序段功能: 从程序预置的初始数据BUF中,
找到第一个负数后,送入BUF1。
从以上注释,可以看出,楼主所贴程序,有几点错误:
1.BUF1 DB 1000 DUP(?) ;程序只用一个字节,
定义为BUF1 DB 0
可也。
2.DEC CL ;CL减去1 //这句应为DEC CX

DATA SEGMENT
BUF DB -3,1,2
BUF1 DB 1000 DUP(?)
DATA ENDS
;;以上是定义一个数据段
;;下面就是代码段了,这是8086程式的内存模式,建议现在不要学这种汇编语言,用32位的汇编语言,其内存是平坦的4G空间,不用考虑内存的分布。写汇编程序就像写C++一样。
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
LEA SI,BUF
MOV CX,1000
MOV AX,[SI]
LP: CMP AL,0
JL NEXT
INC SI
DEC CL
JNZ LP
NEXT: MOV BUF1,AL
MOV AH,4CH
INT 21H
CODE ENDS
END START ;;程序从START开始运行。

DATA SEGMENT ;定义数据段
BUF DB -3,1,2.... ;定义字节变量BUF
BUF1 DB 1000 DUP(?);定义字节变量BUF1
DATA ENDS;数据段定义结束
CODE SEGMENT ;定义代码段
ASSUME CS:CODE,DS:DATA ;段寄存器关联说明
START:MOV AX,DATA; ;数据段段址→ax
MOV DS,AX;ax→ds,给数据段段寄存器赋值
LEA SI,BUF;BUF送源变址寄存器
MOV CX,1000;置计数初值
MOV AX,[SI];取数(因程序不全,没法知道是什么数)
LP:CMP AL,0;所取得的数低字节与0比较
JL NEXT;(此指令应为JZ而非JL)数低字节为0则转NEXT
INC SI;数低字节不为0则源变址寄存器内容加1
DEC CL;计数(减1,应该为DEC CX)
JNZ LP;够1000次则转LP
NEXT: MOV BUF1,AL;数低字节送BUF1
MOV AH,4CH;数4CH送入AX高字节AH中
INT 21H ;4CH号dos功能调用
CODE ENDS;代码段定义结束
END START ;编译到此结束