汇编实验二

题目:编写完整的汇编语言源程序,计算下面的表达式: S=(A*B)/(C+D)+5(A-B)/2+C/D 设 A、B、C、D、S 均为带符号字节数,数据定义如下,可以直接使用: A DB 40H B DB 30H C DB 20H D DB 10H S DB ? 要求: 1. 进一步掌握 DEBUG 的操作,掌握汇编语言程序从编辑、汇编、连接、运行, 以及在 DEBUG 下观察运行结果的全过程。 2. 程序经汇编、连接后,要能正常运行,并且需要在 DEBUG 下运行看到结果, 验证结果的正确性。 3. 请将运行正常并在 DEBUG 下运行能看到正确结果的源程序(.ASM),以 B 字母开头+学号为文件名,如“B1652123.ASM”, 存盘保存。 4. 实验报告请包括以下内容,以及必要的截图,或者你认为需要说明的其它问 题: (1)你的程序运行后,在 DEBUG 下看到的运行结果是什么?即 S=? (2)将你程序中的数据 A、B、C、D 分别改为 70H、60H、40H、20H,那么你的 程序运行后,你见到的结果又是什么?即 S=? (3)对于上述两组数据,如果要计算的表达式是 S=(A*B)/(C-D)+5(A+B)/2+C/D, 这里仅仅是将原来的 C+D 变为 C-D,A-B 变为 A+B,显然使得中间结果出现溢出。 而且即使不修改表达式,对于不同的数据都有可能使中间结果或最终结果产生溢 出。所以在考虑到溢出的情况下,为了使表达式的计算适应不同的数据,那么你 的程序该如何完善?(本题首先 S 应重新定义为 S DW ?),请将修改完善、运行 正常的程序仍以 B1652123.ASM 存盘,再次针对前面两组数据用截图分别说明程 序的运行结果。 (4)*对于除数为 0 的情况如何考虑?比如数据 A、B、C、D 分别为 80H、90H、 10H、00H 时,或其其它分母出现 0 的情况怎样处理?仅作思考。 (5)除以 2 的计算什么情况下必须用右移 1 位来完成?


DATA SEGMENT
A DB 40H
B DB 30H
C DB 20H
D DB 10H
S DB ?
Z DB 05H
W DB 02H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX ,DATA
      MOV DS, AX
      MOV AL, A
      IMUL B  ;乘积存在AX
      MOV CL, D
      ADD CL, C;c+d
      IDIV CL;(A*B)/(C+D) 商在AL,余数在AH
      MOV CL,AL;CL中存第一步的结果
      MOV AL,A
      MOV AH,B
      SUB AL,AH
      IMUL Z
      IDIV W;商在AL,余数在AH
      ADD CL,AL
      MOV AL,C
      MOV AH,0
      IDIV D
      ADD CL,AL
      MOV S,CL
      MOV AX, 4C00H
      INT 21H
 CODE ENDS
      END START
      
    
      


你可能感兴趣的:(汇编)