c) 程序源代码 DATA SEGMENT
ORG 2000H;数据存放在2000H开始的单元
BCD DB 10H,28H,49H,69H,0A1H,0C3H,96H,29H,45H,02H DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX
MOV SI,2000H;地址指针指向单元首地址 MOV CX,10
MOV DL,80H;设置最小符号数 L1: LODSB
CMP AL,DL;比较带符号数 JNG L2 ;(DL)大则跳转L2
MOV DL,AL;DL指向内容小则交换 L2: LOOP L1
MOV DS:[2000H],DL;最大数存放在2000H单元 MOV AH,4CH INT 21H CODE ENDS END START
运行:BCD DB 10H,28H,49H,69H,0A1H,0C3H,96H,29H,45H,02H 结果为69H
第三题(P195,第6题)
试编制一程序,用乘法指令实现32位二进制数与16位二进制数相乘。 a) 实验原理
首先把被乘数第八位和高八位分别与乘数相乘,高八位乘得结果左移16位与第八位乘得结果相加即为结果。
b) 程序框图
c) 程序源代码 DATA SEGMENT
DATAX DW 1000H,1000H DATAY DW 2000H DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA
MOV DS,AX
MOV BX,1000H ;将把结果存到1000H开始的单元中 MOV SI,OFFSET DATAX MOV DI,DATAY
MOV AX,[SI]
MUL DI ;把低16位相乘,结果存到AX,DX中
MOV [BX],AX ;把结果中低16位存到BX对应的存储单元 MOV [BX+2],DX ;把结果中高16位存到BX+2对应的存储单元
MOV AX,[SI+2] ;计算被乘数高16位相乘的结果 MUL DI
ADD [BX+2],AX ;把两次相乘结果对应(把第二次的结果 ;向左移16位)相加,最后结果存在了[BX] 到[BX+5] ADD [BX+4],DX MOV AH,4CH INT 21H CODE ENDS END START
运行:结果在DS:1000中
第四题(P196,第12题)
设有两个等字长,字节型字符串,试编写一汇编程序,比较它们是否完全相等,若相等则将字符Y送入AL中,否则将字符N送入字符中。
a) 程序框图
b) 程序源代码 DATA SEGMENT
STRX DB 'CZX0','$' STRY DB 'CZX1','$' DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV ES,AX CLD
LEA DI,STRY;取字符串1首地址 LEA SI,STRX;取字符串2首地址 CALL L1
MOV DL,AL ;显示结果 MOV AH,02H INT 21H
MOV AH,4CH INT 21H L1 PROC
MOV CX,10
REPZ CMPSB STRX,STRY ;比较两个字符串 JNZ RA ;不相等则跳转到RA MOV AL,'Y' ;相等则将Y送AL