|
主题 : : 大家这么高兴致,我也帖下我的实验一和实验二的代码 [待解决] |
回复[ 2次 ]
点击[ 309次 ] | |
荣誉值:0
信誉值:2
注册日期:2010-07-02 05:46 |
实验一的:
ASSUME CS:CODE,DS:DATA,SS:STACK
DATA SEGMENT
DB 'Welcome to masm!',0
DATA ENDS
STACK SEGMENT
DW 0,0,0,0,0,0,0,0
STACK ENDS
CODE SEGMENT
START: MOV AX,DATA
MOV DS,AX ;设置Data段为DS段
MOV AX,STACK
MOV SS,AX
MOV SP,10H ;设置栈段
MOV SI,0 ;设置SI变量,Ds:si指向数据段起始位置,si用于控制数据位变化
MOV DI,0 ;设置行变量,以0a0h为基数变化,(实际输出行未变化)
MOV DH,8 ;行变量参数
MOV DL,3 ;列变量参数
MOV CL,2 ;输出字符属性参数
MOV CH,0
CALL SHOW_STR ;
MOV AX,4C00H ;
INT 21H ;
SHOW_STR: PUSH CX ;因为要用到CX,所以先将CL入栈
MOV AX,0B800H ;
MOV ES,AX ;用ES段做显示输出
MOV AL,0A0H ;每行字符数
MOV AH,0 ;
MUL DH ;定位字符输出行,即第8行起始地址
PUSH AX ;将行参数保存
MOV AL,2 ;
MOV AH,0 ;
MUL DL ;定位字符输出列
MOV BX,AX ;将列参数送入BX中
POP AX ;提取行参数
ADD BX,AX ;行列参数都保存到bx中
MOV AL,DS:[SI] ;将数据段字符送入AL
MOV CL,DS:[SI] ;如该数据为0,
JCXZ OK ;则跳转至OK处断续执行,如否,则向下执行
POP CX
MOV ES:[BX+DI-0A0H-2H],AL ;将ds:[si]处内容输出到屏幕
MOV ES:[BX+DI-0A0H-1H],CL ;输出上行内容的属性值
INC SI ;将ds:[si]指向下一字符
ADD DI,2H ;将目的地址指向下一单元,字符和属性值各占一个字节,所以加2
JMP SHOW_STR ;因ds:[si]内容不为0,指令跳转到标号开始形成循环
OK: RET
CODE ENDS
END START
实验二:
ASSUME CS:CODE,SS:STACK
STACK SEGMENT
DD 0,0,0,0
STACK ENDS
CODE SEGMENT
START: MOV AX,STACK
MOV SS,AX
MOV SP,10H
MOV AX,4240H
MOV DX,0FH
MOV CX,0AH
CALL DIVDW
MOV AX,4C00H
INT 21H
DIVDW: PUSH CX ;保存cx原值
MOV CX,100 ;cx取新值参与运算
MOV BX,10 ;新值为原值bx倍
DIV CX ;用新值运算,商存Ax中,余数存dx中
POP CX ;弹出原值
PUSH DX ;余数入栈,以免下步结果覆盖
MUL BX ;商乘倍数
MOV [SI],DX ;保存可能产生的高16值
POP DX ;弹出上步计算余数
PUSH AX ;保存上步计算结果
MOV AX,DX ;上步计算余数送入ax,(如果超过0FFFF?)
MOV DX,0 ;
DIV CX ;
MOV CX,DX ;把最后计算余数送入cx
MOV BX,AX
POP AX
ADD AX,BX
MOV DX,[SI]
RET
CODE ENDS
END START
这个结果虽然正确,但经过与别人对比,发现问题其实老大了。总体思路来说,要解决除尘溢出,要么把被除数分开计算,要么把除数分开计算。但很明显,被除数分开比除数分开简单的多,教材中给的提示也应该是将被除数分开,只是兄弟愚蒙,没看明白教材的意思,按自己的想法,用的除数分开的方式写的,虽然结果正确,但感觉如果子程序中第一次商值与第二次商值相加产生进位的情况的话,我这个就出问题了。可是,我又解决不了,想了半天也没好办法。 | | |