汇编语言之实现32位加减乘操作

汇编语言之实现32位加减乘操作

基础知识

  1. 在做加法的时候,以补码运算,以无符号数是否进位决定CF是否为1,以有符号数运算结果是否合理决定OF是否为0。对于到底是有符号数还是无符号数,取决于如何理解内存中的二进制数据。
  2. 在用16位实现32位双精度加法时,DX,AX组成一组,BX,CX组成一组,低位用ADD,高位用ADC,得出结果。
  3. INC不考虑CF位。
  4. CBW默认将AL寄存器的值拓展到AX,正数补0,负数补F。
  5. CWD默认将AX寄存器的值拓展到DX,AX,DX为高位,AX为低位,正负数填补情况同上。

实验内容

利用16位汇编指令实现32位的加减乘操作,并且说明在执行过程中各个标志位的变化以及变化的原因。

加法操作

程序说明

  1. 首先读入第一个数据 -9CH,并拓展成双字
  2. 将其的高位和低位分别移动到BX,CX后,读入第二个数据,并且执行拓展为双字的操作
  3. 之后用ADD指令将其低位字相加,用ADC将其高位字相加
  4. 执行完ADD AX,CX后可以看到,SF标志位由PL变为NG,原因是 -9CH + 4DH 的运算结果为负数,所以符号寄存器SF便有PL(正数)变为NG(负数)。
  5. 执行完ADC DX,BS后,所要观察的标志位没有发生变化,原因是进行FFFFH和0000H的相加,并没有溢出进位等改变。

程序代码

DATAS SEGMENT
     A dw -100; FFFFFFFF9C
     B dw 77  ; 4D
     V dw 11  ; B
     D dw 9   ; 9
DATAS ENDS
CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS
START:
    MOV AX,DATAS
    MOV DS,AX
    ; ADD
    MOV AX,A
    CWD
    MOV CX,AX
    MOV DX,BX
    MOV AX,B
    CWD
    ADD AX,CX
    ADC DX,BX
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

减法操作

程序说明

  1. 读入一个操作数 -9CH 并且拓展为双字
  2. 读入第二个操作数 F9H,并且拓展为双字
  3. 执行减法操作
  4. 对低位用SUB指令,在执行完SUB AX,CX后,发现CF标志位由NC变为了CY,即进位由无变为了有,原因是在进行减法的时候,相当于是 -9C-F9H,对应十进制的-100-255,最高位发生了借位操作。
  5. 对高位用SBB指令,在执行完SBB
    DX,BX后,发现ZF由NZ变为ZR,原因是0000与FFFF做减法运算结果非0。

程序代码

DATAS SEGMENT
     A dw -100; FFFFFFFF9C
     B dw 255 ; FF
DATAS ENDS
CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS
START:
    MOV AX,DATAS
    MOV DS,AX
    ; SUB
    MOV AX,A
    CWD
    MOV CX,AX
    MOV BX,DX
    MOV AX,B
    CWD
    SUB AX,CX
    SBB DX,BX
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

乘法操作

程序说明

  1. 读入两个数据的低位,并做乘法运算。发现在执行完 MUL DX后,发现CF标志位由NC变为CY,OF由NV变为OV,原因是1234H 与1234H相乘后结果溢出,且有进位。
  2. 读入第一个数字的高位和第二个数字的低位,做乘法。在执行完乘法后发现,OF标志位由OV变成NV,而CF标志位由CY变为NC,说明 此次乘法没有溢出,也没有进位,16位运算可以放得下。
  3. 读入第一个数字的低位和第二个数字的高位,做乘法运算。做完乘法运算后发现,ZF寄存器由ZR变为了NZ,表示运算结果非0。而CF和OV标志寄存器未发生改变,说明运算没有进位和溢出。
  4. 读入第一个数的高位和第二个数的高位,做乘法运算。执行完乘法后发现,ZF标志位由ZR变为NZ,说明运算结果非零。

程序代码

DATAS SEGMENT
     XH DW 0001H ;x1
     XL DW 1234H ;x2
     YH DW 0002H ;y1
     YL DW 1234H ;y2
     TEMP DW 4 DUP (?) 
DATAS ENDS
CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS
START:
    MOV AX,DATAS
    MOV DS,AX
    ; MUL
    MOV AX,XL
    MOV DX,YL
    MUL DX
    MOV [TEMP],DX
    MOV [TEMP+2],DX

    MOV AX,XH
    MOV DX,YL
    MUL DX
    ADD [TEMP+2],AX
    ADC [TEMP+4],DX

    MOV AX,XL
    MOV DX,YH
    MUL DX
    ADD [TEMP+2],AX
    ADC [TEMP+4],DX
    ADC [TEMP+6],0

    MOV AX,XH
    MOV DX,YH
    MUL DX
    ADD [TEMP+4],AX
    ADC [TEMP+6],DX

    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

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