发布网友 发布时间:2022-04-21 09:46
共5个回答
热心网友 时间:2023-07-11 16:20
不好意思,原来的代码确实有些小问题。
至于16位,32位等的问题,请其他几位看看实际数值,而且楼主已经明确说是16位运算,还需要考虑DX吗?
更正如下:
DSEG SEGMENT
XXX DW 540
YYY DW 1
ZZZ DW -1
VVV DW 1080
WWW DW 0
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
START: MOV AX,DSEG
MOV DS,AX
MOV AX,XXX
IMUL YYY
ADD AX,ZZZ
SUB AX,540
MOV BX,VVV
SUB BX,AX
MOV AX,BX
CWD
IDIV XXX
MOV WWW,AX
HLT
CSEG ENDS
END START
************************************************
4-15 09:17
代码如下:其他的操作要靠你自己了,在这里写不了
DSEG SEGMENT
XXX DB 540
YYY DB 1
ZZZ DB -1
VVV DB 1080
WWW DB 0
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
START: MOV AX,DSEG
MOV DS,AX
MOV AX,XXX
MUL YYY
ADD AX,ZZZ
SUB AX,540
MOV BX,VVV
SUB BX,AX
MOV AX.BX
CBW
IDIV XXX
MOV WWW,AX
HLT
CSEG ENDS
END START:
热心网友 时间:2023-07-11 16:20
大哥们!我是学八位机的!十六位我没用过!我认为程序应该有通用性,对有符号来说,应该先对乘数和被乘数的符号位进行逻辑运算!此结果是直接导致积的符号!如果讲究程序通用性,还应该把高八位和低八位分开运算,以防溢出时有误!
这是小弟初学鄙见,希望高手别保留多指教!谢谢!
热心网友 时间:2023-07-11 16:21
带借位减法指令 SBB (subtract with borrow)
指令的汇编格式:SBB dst,src
指令的基本功能:(dst)<-(dst)-(src)-CF
指令支持的寻址方式:他们两个操作数不能同时为存储器寻址。
即为除源操作数为立即数的情况外,源操作数和目地操作数必须有一个寄存器寻址方式。
指令对标志位的影响:SF=1 减法结果为负数(符号位为1)
SF=0 减法结果为正数(符号位为0)
ZF=1 减法结果为零
ZF=0 减法结果不为零
CF=1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况)
CF=0 二进制减法运算中最高有效为向高位无借位(被减数〉=减数,够减的情况)
OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。
OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。
热心网友 时间:2023-07-11 16:21
16位的乘法要用到dx:ax吧
热心网友 时间:2023-07-11 16:22
楼上的程序有几个明显的错误,应改为:
DSEG SEGMENT
XXX DW 540
YYY DW 1
ZZZ DW -1
VVV DW 1080
WWW DW 0
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
START: MOV AX,DSEG
MOV DS,AX
MOV AX,XXX
IMUL YYY
ADD AX,ZZZ
ADC DX,0
SUB AX,540
SBB DX,0
MOV BX,AX
MOV CX,DX
MOV AX,VVV
CWD
SUB AX,BX
SBB DX,CX
IDIV XXX
MOV WWW,AX
MOV AH,4CH
INT 21H
CSEG ENDS
END START
这个程序不管xxx、yyy、zzz、vvv取什么数据,都能得到正确结果,当然xxx不能为0。
一定要考虑dx,因为x*y的结果是32位数。
作者dianzix的程序可能得不到正确结果。