自内存0500H单元开始,保存有10个无符号字节类型的数据,分别是45H、89H、11H、26H、8AH、9FH、78H、0AAH、18H、3EH,请编写程序,求这10个数的和。
要求:(1)用8位二进制数运算方式进行计算。
? ? ? ? ? (2)结果用两个字节表示。
? ? ? ? ? (3)把结果存放到050AH和050BH单元,且高字节放在050BH单元。
分析:?1,(2)中用两个字节:一定要用到adc ah,0
? ? ? ? ? ?2,存在内存单元下图:
45H | 0500H |
89H | 0501H |
11H | 0502H |
26H | 0503H |
8AH | 0504H |
9FH | 0505H |
78H | 0506H |
0AAH | 0507H |
18H | 0508H |
3EH | 0509H |
放和的低字节 | 050AH |
放和的高字节 | 050BH |
3,0500H用到了数据段的ORG定位偏移地址这个伪指令----org指定这个变量区的首地址
4,之后定义内存数据区? ?定义buf? -----buf? DB??45H、89H、11H、26H、8AH、9FH、78H、0AAH、18H、3EH
5,结果放到具体区域就不用定义了
DATA SEGMENT
ORG 0500H ;定位偏移地址
BUF DB 45H,89H,11H,26H,8AH,9FH,78H,0AAH,18H,3EH;
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX;数据段
MOV AX,00H ;累加器清零
LEA BX,BUF
MOV CX,10;
L1:MOV DL,[BX];取第一个字节放到DL求和
ADD AL,DL
ADC AH,0;用16位二进制表示
INC BX
LOOP L1
MOV [050AH],AX;存放到指定位置
MOV AH,4CH
INT 21H
CODE ENDS
END START
这是一个循环结构。
编写完整汇编语言程序实现功能。
在M单元和N单元分别存有一个8位无符号数36H和95H,要求比较这两个无符号数,并根据比较结果在屏幕上显示M>N或N>M(假设这两个数不相等)。
分析:1,首先是无符号数
? ? ? ? ? 2,显示字符串
? ? ? ? ? 3,M DB 36H在M单元定义一个字节内容是36H
? ? ? ? ? ? ? N DB 95H 在N单元定义一个字节内容是95H,这个在数据段,然后比较在代码段
? ? ? ? ? 4,显示字符串需要用到零九号功能,21号中断。
DATA SEGMENT
M DB 36H
N DB 95H
STR1 DB 'M>N' '$'
STR2 DB 'N>M' '$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX;数据段
MOV AL,M;AL=36H
CMP AL,N;M和N比较
JA D1
LEA DX,STR2
MOV AH,9
INT 21H ;显示'N>M'
JMP EXIT
D1:LEA DX,STR1
MOV AH,9
INT 21H;M>N显示'M>N'
EXIT:
MOV AH,4CH
INT 21H ;返回DOS环境
CODE ENDS
END START
这是一个单分支的结构。
在内存单元BUF中存放着一个8位有符号二进制数X,试根据以下关系,用8086汇编语言编写求Y值,并将结果存入RESULT单元:X>0,Y=1;X=0;Y=0;X<0,Y=-1。
DATA SEGMENT
BUF DB X
RESULT DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX;数据段
MOV AL,BUF;AL=X
CMP AL,0 ;AL和0比较
JZ ZERO ;X=0跳
JS NEG;X是负数跳
MOV AL,1;X是正数
JMP SAV
ZERO:
MOV AL,0
JMP SAV
NEG:MOV AL,-1
SAV:MOV RESULT,AL
MOV AH,4CH
INT 21H ;返回DOS环境
CODE ENDS
END START
这是一个多分支的结构。
? 用汇编语言编写对AL中的数据进行“偶校验”的一个过程,并将校验结果放入AL寄存器。如果AL中“1”的个数是偶数,结果是00H,否则是0FFH。
分析:1,判断AL中1的个数,若为偶数AL=0,为奇数AL=FFH,分支结构。
? ? ? ? ? ?2,PF是低八位1的个数,PF=1时,1的个数为偶数;PF=0时,
? ? ? ? ? ?tips:标志位:MOV不影响任何标志位,加减乘除影响标志位。AND OR TEST XOR这四个指令对标志位的共同特征影响:CF=OF=0,对其他的4个PF SF ZF AF是受影响的。
DATA SEGMENT
BUF DB X
RESULT DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AL,DATA
OR AL,AL
JP L1
MOV AL,0FFH
JMP L2
L1:MOV AL,0
L2:
MOV AH,4CH
INT 21H ;返回DOS环境
CODE ENDS
END START
另一种:
DATA SEGMENT
BUF DB X
RESULT DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV CX,8
L2:SHL AL,1
JNC L1 ;al为0 CF=0
INC BL;移位统计BL的个数存入BL
L1:LOOP L2
TEST BL,01H
JZ L3
MOV AL,FFH
JMP L4
L3:MOV AL,0
L4:
MOV AH,4CH
INT 21H ;返回DOS环境
CODE ENDS
END START
写出能够在屏幕上显示字符串“HELL0 WROLD!”的完整汇编语言程序。
DATA SEGMENT
STRING DB 'HELLO.WORD!','$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA DX,STRING
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H ;返回DOS环境
CODE ENDS
END START
用汇编语言编写程序,从外设71H读取一个数M,判断其值是否在10和20之间,如果M≥20,则送0FFH给外设73H;如果M<10,则送00H给外设73H;如果M<10,则送00H给外设73H;如果10≤M<20,则送88H给外设73H。
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
IN AL,71H;将71H端口的字节读入AL
CMP AL,10
JB L1;小于10跳L1
CMP AL,20
JB L2;大于等于10且小于20跳L2
MOV BL,0FFH
JMP L3
L1:MOV MOV BL,00
JMP L3
L2:MOV BL,88H
L3:MOV AL,BL
OUT 73H,AL;将AL的0FFH输出到73H端口
MOV AH,4CH
INT 21H ;返回DOS环境
CODE ENDS
END START
内存MEM单元开始存放着10个带符号字节数据,编写完整程序求其中正数、零和负数的个数,分别将他们存于PLUS、ZERO和NEGO 3个单元。
分析:(1)把十个数取出来设一个指针BX? ?[BX]
? ? ? ? ? ?(2)取出来和0比较
DATA SEGMENT
BUF DB 12H,23H,24H,56H,78H,98H,89H,54H,17H;定义10个带符号的数
PLUS DB 0
ZERO DB 0
NEGO DB 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV CX,10
LEA BX,BUF
LP:MOV AL,[BX]
CMP AL,0
JG L1;正数跳L1
JZ L2;等于0跳L2
INT NEGO;否则是负数
JMP L3
L1:INC PLUS
JMP L3
L2:INC ZERO
L3:INC BX;指针指向下一个
LOOP LP;循环修改和控制
MOV AH,4CH
INT 21H ;返回DOS环境
CODE ENDS
END START
完成下面程序,实现求内存数据区中BUF开始的10个8位无符号数的和,并存放在SUM字单元中,假设和不大于两个字节。
DATA SEGMENT
BUF DB 12H,23H,24H,56H,78H,98H,89H,54H,17H;定义10个无符号的数
SUM DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA SI,BUF
MOV CX,10
XOR AH,AH;AH清0
MOV AL,[SI];取第一个数给AL
L1:ADD AL,[SI]
ADC AH,O;和放AX
INC SI
LOOP L1
MOV SUM,AX
MOV AH,4CH
INT 21H ;返回DOS环境
CODE ENDS
END START
此实验总结:
(1)从内存取数,[SI]——LEA? SI,BUF MOV AL,[SI]? ???指针指向下一位INC SI
用LEA把内存单元数据区的首地址给SI,然后MOV从SI指针指向的单元中取出第一个数来给AL
(2)求和:ADD AL,[SI]
?和是字还要ADC AH,0实现了字节求和变成了字。
(3)注意定义段伪指令那些。
请写出汇编语言程序实现如下功能:从键盘输入1~5中的任何一个数,分别在屏幕上显示“1st”、
“2st”、“3st”、“4st”、“5st”,键入其他字符则显示“*”。
分析:
(1)显示 用21号中断中的显示单个字符的2号功能。
MOV DL,把被显示字符的acall码放在DL中
MOV AH,2
INT 21H
(2)显示字符串:9号功能
LEA DX,字符串首地址(一般变量表示)
MOV AH,9;9号功能
INT 21H
(3)键盘接收:1号功能
MOV AH,1
INT 21H
MOV AL,接收的字符放AL中
(4)判断是否是字符1到5之间。
data segment
ends
code segment
assume cs:code,ds:data
start:
MOV AH,1;1号功能
INT 21H;中断
MOV AH,2;2号功能单个字符
CMP AL,'1'
JB EXITS
CMP AL,'5'
JA EXITS
MOV DL,AL
INT 21H
MOV DL,'s'
INT 21H
MOV DL 't'
INT 21H
JMP L2
EXITS:MOV DL,'*'
INT 21H
L2:MOV AH,4CH
INT 21H
CODE ENDS
end start ; set entry point and stop the assembler.
以上仅供参考。
路过的点个赞叭~