本章练习答案



同学们在完成下述编程题目时,最初可能会遇到困难。可以参考教材中例题,推荐参考手册、文献、网络查找指令的用法。需要上机调试,直至不需要参考例题,仅参考指令用法规范即可完成任务。从参考他人代码到自己掌握,这是正常的学习过程。在编程中,即使熟练工程师也常参考手册查找指令用法的规范。

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