汇编算数(v-(x*y+z-540))/x

发布网友 发布时间: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的程序可能得不到正确结果。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com