分析: 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
这是一个循环结构。
分析: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
这是一个单分支的结构。
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
这是一个多分支的结构。
分析: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
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
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
分析:(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
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)显示 用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.
以上仅供参考。
路过的点个赞叭~