同学们在完成下述编程题目时,最初可能会遇到困难。可以参考教材中例题,推荐参考手册、文献、网络查找指令的用法。需要上机调试,直至不需要参考例题,仅参考指令用法规范即可完成任务。从参考他人代码到自己掌握,这是正常的学习过程。在编程中,即使熟练工程师也常参考手册查找指令用法的规范。
3.编程计算 (W-(X*Y+Z-200))/25,其中X,Y,Z和W都是带符号16位数,计算结果的商存入AX,余数存入DX。上机调试。
答:
SSEG SEGMENT STACK 'STACK'
DW 64 DUP(?)
TOS LABEL WORD
SSEG ENDS
DATA SEGMENT
X DW 6
Y DW -7
Z DW -280
W DW 2011
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:SSEG,ES:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AX,SSEG
MOV SS,AX
MOV SP,OFFSET TOS
MOV AX,X
IMUL Y
MOV CX,AX
MOV BX,DX ;(BX,CX)=X*Y
MOV AX,Z
CWD ;(DX,AX)←把Z扩展为双字类型
ADD CX,AX
ADC BX,DX ;(BX,CX)=X*Y+Z
SUB CX,200
SBB BX, ;(BX,CX)=X*Y+Z-200
MOV AX,W
CWD ;(DX,AX)←把W扩展为双字类型
SUB AX,CX
SBB DX,BX
MOV BX,25
IDIV BX
MOV AH,4CH
INT 21H
CODE ENDS
END START
4.将内存数据段INSTR地址开始存放的一个由字母组成的字符串中的小写字母全部转换成大写字母(其余字符不变)后存至内存数据段OUTSTR地址处。如原字符串是“hello ASM! 20110601”,那么转换完后应该是“HELLO ASM! 20110601”。上机调试。
答:
DATA SEGMENT
INSTR DB 'hello ASM! 20110601'
STRLEN EQU $-INSTR
OUTSTR DB STRLEN DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA SI,INSTR
LEA DI,OUTSTR
MOV CX,STRLEN
NEXTCHAR:
MOV AL,[SI]
CMP AL,'a'
JB UNCHG ;不是小写字母,则不转换
CMP AL,'z'
JA UNCHG ;不是小写字母,则不转换
SUB AL,20H ;将小写字母转换为大写字母
UNCHG:
MOV [DI],AL
INC SI
INC DI
LOOP NEXTCHAR
MOV AH,4CH
INT 21H
CODE ENDS
END START