1:内存分布图
注意: 必须弄懂这个图,这能良好处理指令序列
常用归零代码:
1:MOV AX,0 2:SUB AX,AX 3:XOR AX,AX 4:AND AX,00H
1假设寄存器AX保存的是一个有符号数,编写一个程序实现加下功:
DATAS SEGMENT X DW 02H; DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX XOR AX,AX MOV AX,X CMP AX,0 JGE next MOV AX,-1 JMP next2 next: MOV AX,1 next2: MOV AH,4CH INT 21H CODES ENDS END START
2: 编制一完整的程序,统计有符号字数组ARRARW中大于5,小于5和等于5的数据个数,并将其分别存储到字变量MAX5,MIN5和EQU5中去
注意: INC DEC 指令不能直接操作 数据段中的操作数
正确的程序:
DATAS SEGMENT ARRARW DW '1','2','5','6','8' MAX5 DW ?; MIN5 DW ?; EQU5 DW ?; len DW $-ARRARW; DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX XOR AX,AX ;存储MIN5 XOR BX,BX ;存储MAX5 XOR DX,DX ;存储EQU5 MOV CX,5; MOV SI,0 next: CMP ARRARW[SI],'5' JGE large5 INC AX ; 小于5 JMP next2 large5: CMP ARRARW[SI],'5' JE equ5s INC DX ;大于5 JMP next2 equ5s: INC BX ;等于5 next2: INC SI CMP SI,len JGE next3 LOOP next next3: ADD AX,30H ; DW进行对齐 ADD BX,30H ; ADD DX,30H ; MOV MIN5,AX;1 MOV MAX5,DX;2 MOV EQU5,BX;2 MOV AH,4CH INT 21H CODES ENDS END START
原来错误的程序:
为什么显示不出来 因为DW中的是自变量需要手动加30H, 改正后正常显示正常
DATAS SEGMENT ARRARW DW '1','2','5','6','8' MAX5 DW ?; MIN5 DW ?; EQU5 DW ?; len DW $-ARRARW; DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX XOR AX,AX ;存储MIN5 XOR BX,BX ;存储MAX5 XOR DX,DX ;存储EQU5 MOV CX,5; MOV SI,0 next: CMP ARRARW[SI],'5' JGE large5 INC AX ; 小于5 JMP next2 large5: CMP ARRARW[SI],'5' JE equ5s INC DX ;大于5 JMP next2 equ5s: INC BX ;等于5 next2: INC SI CMP SI,len JGE next3 LOOP next next3: MOV WORD PTR MIN5,AX;这里看不到值 有疑问 MOV WORD PTR MAX5,DX MOV WORD PTR EQU5,BX MOV AH,4CH INT 21H CODES ENDS END START
3: 编制求BX寄存器中的信息含有多少个二进制位"1"的程序
正确程序:
DATAS SEGMENT X DB '123411' len EQU $-X DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX MOV AX,0H MOV BX,0H MOV CX,6; next: CMP X[BX],31H JNE next2 INC AX ; 表示1的个数 JMP next2 next2: INC BX loop next MOV AH,4CH INT 21H CODES ENDS END START
错误程序如下(自己写的有不想删除,当做教训):
DATAS SEGMENT X DB 1,2,3,4,1,1 len EQU $-X DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX XOR AX,AX XOR BX,BX LEA BX,X MOV CX,len next:SHL BL,1 JNC next2 INC AL next2: loop next MOV AH,4CH INT 21H CODES ENDS END START