设X,Y,Z,W均为有符号双字型内存变量,试编写完整汇编语言源程序,实现表达式W=X+Y+36-Z

设X,Y,Z,W均为有符号双字型内存变量,试编写完整汇编语言源程序,实现表达式W=X+Y+36-Z,第1张

DATA SEGMENT

X DD 12345H

Y DD 12346H

Z DD 12347H

W DD

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX

MOV AX,WORD PTR X

MOV DX,WORD PTR X+2

ADD AX,WORD PTR Y

ADC DX,WORD PTR Y+2

ADD AX,36

ADC DX,0

SUB AX,WORD PTR Z

SBB DX,WORD PTR Z+2

MOV WORD PTR W,AX

MOV WORD PTR W+2,DX

MOV AH,4CH

INT 21H

CODE ENDS

END START

#include <stdioh>

// 8421BCD码长整数转换为长整数

unsigned long BCD2BIN_l(unsigned long num)

{

unsigned long out = 0;

unsigned char i = 0;

while(num && i++ < 8)

{

if(out) out =10;

if(num & 0xF0000000 == 0) continue;

out += (num >> 28) & 0xF;

num <<= 4;

}

while(i++ < 8) out = 10;

return out;

}

// 长整数转换为8421BCD码长整数

unsigned long BIN2BCD_l(unsigned long num)

{

unsigned long out = 0;

unsigned char i = 0;

while(num && i++ < 8)

{

out >>= 4;

out |= (num % 10) << 28;

num /= 10;

}

while(i++ < 8) out >>= 4;

return out;

}

// 8421BCD码短整数转换为短整数

unsigned short BCD2BIN_s(unsigned short num)

{

unsigned short out = 0;

unsigned char  i = 0;

while(num && i++ < 4)

{

if(out) out =10;

if(num & 0xF000 == 0) continue;

out += (num >> 12) & 0xF;

num <<= 4;

}

while(i++ < 4) out = 10;

return out;

}

// 短整数转换为8421BCD码短整数

unsigned short BIN2BCD_s(unsigned long num)

{

unsigned short out = 0;

unsigned char i = 0;

while(num && i++ < 4)

{

out >>= 4;

out |= (num % 10) << 12;

num /= 10;

}

while(i++ < 4) out >>= 4;

return out;

}

// 整数转换为8421BCD码整数

unsigned char BIN2BCD_c(unsigned char num)

{

return ((num / 10) << 4) | (num % 10);

}

// 整数转换为8421BCD码整数

unsigned char BCD2BIN_c(unsigned char num)

{

return ((num & 0xF0) >> 4)  10 + (num & 0xF);

}

unsigned char rMul_BCD_c(unsigned char x, unsigned char y, unsigned char p)

{

// p为小数位数

unsigned short r = BCD2BIN_s(x)  BCD2BIN_s(y);

while(p != 1) {r /= 10; p--;}

return BIN2BCD_c((unsigned char)((r + 5) / 10));

}

unsigned short rMul_BCD_s(unsigned short x, unsigned short y, unsigned char p)

{

// p为小数位数

unsigned long r = BCD2BIN_l(x)  BCD2BIN_l(y);

while(p != 1) {r /= 10; p--;}

return BIN2BCD_s((unsigned short)((r + 5) / 10));

}

unsigned char rMul_BIN_c(unsigned char x, unsigned char y, unsigned char p)

{

// p为小数位数

unsigned short r = (unsigned short)x  (unsigned short)y;

while(p != 1) {r /= 10; p--;}

return (unsigned char)((r + 5) / 10); // 四舍五入

}

unsigned short rMul_BIN_s(unsigned short x, unsigned short y, unsigned char p)

{

// p为小数位数

unsigned long r = (unsigned long)x  (unsigned long)y;

while(p != 1) {r /= 10; p--;}

return (unsigned short)((r + 5) / 10); // 四舍五入

}

// 演示函数结果

void main()

{

// 整数计算演示

unsigned long x = 0x9678;

unsigned long y = 0x4865;

printf("整数计算演示\nunsigned long\nBIN: %u  %u = %u\n", x, y, x  y);

printf("BCD: %X  %X = %X\n", x, y, BIN2BCD_l(BCD2BIN_l(x)  BCD2BIN_l(y)));

unsigned short sx = 0x97;

unsigned short sy = 0x48;

printf("unsigned short\nBIN: %u  %u = %u\n", sx, sy, sx  sy);

printf("BCD: %X  %X = %X\n", sx, sy, BIN2BCD_s(BCD2BIN_s(sx)  BCD2BIN_s(sy)));

unsigned char cx = 0x6;

unsigned char cy = 0x12;

printf("unsigned char\nBIN: %u  %u = %u\n", cx, cy, cx  cy);

printf("BCD: %X  %X = %X\n", cx, cy, BIN2BCD_c(BCD2BIN_c(cx)  BCD2BIN_c(cy)));

// 1位定点小数演示

printf("1位定点小数演示\n2 Byte\nBIN: %g  %g = %g\n", sx  01 , sy  01 , rMul_BIN_s(sx, sy, 1)  01);

printf("BCD: %g  %g = %g\n", BCD2BIN_s(sx)  01, BCD2BIN_s(sy)  01, BCD2BIN_s(rMul_BCD_s(sx, sy, 1))  01);

printf("1 Byte\nBCD: %g  %g = %g\n", cx  01 , cy  01 , rMul_BIN_c(cx, cy, 1)  01);

printf("BCD: %g  %g = %g\n", BCD2BIN_c(cx)  01, BCD2BIN_c(cy)  01, BCD2BIN_c(rMul_BCD_c(cx, cy, 1))  01);

// 2位定点小数演示

printf("2位定点小数演示\n2 Bytet\nBIN: %g  %g = %g\n", sx  001 , sy  001 , rMul_BIN_s(sx, sy, 2)  001);

printf("BCD: %g  %g = %g\n", BCD2BIN_s(sx)  001, BCD2BIN_s(sy)  001, BCD2BIN_s(rMul_BCD_s(sx, sy, 2))  001);

printf("1 Byte\nBCD: %g  %g = %g\n", cx  001 , cy  001 , rMul_BIN_c(cx, cy, 2)  001);

printf("BCD: %g  %g = %g\n", BCD2BIN_c(cx)  001, BCD2BIN_c(cy)  001, BCD2BIN_c(rMul_BCD_c(cx, cy, 2))  001);

}

ASSUME   CS:CC, DS:QQ

     

QQ  SEGMENT

    VV   DW   4

    WW   DW   +100

    XX   DW   -100

    YY   DW   +800

    ZZ   DW   

QQ  ENDS

;----------------------------------

CC  SEGMENT

     

BG:

    MOV   AX, QQ

    MOV   DS, AX

;-----------------------------

    MOV   AX, XX

    IMUL  YY

    IDIV  WW

    MOV   ZZ, AX

 

    MOV   AX, XX

    IMUL  VV

    ADD   ZZ, AX

;-----------------------------

EXIT:

    MOV   AH, 4CH

    INT   21H         ;返回DOS

;----------------------------------

CC  ENDS

    END   BG

用 DEBUG 调试,过程以及结果都正确。

ZZ 中的内容是 FB50H,也就是-1200。

1 输入时三个数间逗号分隔

#include <stdioh>

void swc(int x,int y){int t;t=y;y=x;x=t;}

main()

{

int x,y,z;

scanf("%d,%d,%d",&x,&y,&z);

if(x>y) swc(&x,&y);

if(x>z) swc(&x,&z);

if(y>z) swc(&y,&z);

printf("\n%d\n%d\n%d",x,y,z);

return 0;

}

2

#include <stdioh>

#include <stdlibh>

#include <timeh>

#define MAX 10

main()

{

unsigned int num[MAX],max,min,c,t;

srand(time(0));

for(t=0;t<MAX;++t) num[t]=rand()%71+30;

max=min=num[0];

c=0;

for(t=0;t<MAX;++t)

{

if(max<num[t]) max=num[t];

else if(min>num[t]) min=num[t];

c+=num[t];

printf("%5d",num[t]);

}

printf("\nmax=%d,min=%d,average=%d,sum=%d",max,min,c/MAX,c);

return 0;

}

3

#include <stdioh>

main()

{

float s=10,t=10;

int c=2,p=2;

while(t>1e-4)

{

t=10/(float)c;

s+=t;

c+=p;

++p;

}

printf("%f",s);

return 0;

}

#include <stdioh>

void main()

{

int a,b,c;

scanf("%d %d %d",&a,&b,&c);

int max=a;

if(max<b)max=b;

if(max<c)max=c;

printf("%d\n",max);

}

这是输出最大值,最大的输出后再比较留下来的两个再输出就可以了

一穷举法

#include<stdioh>

main()

{int a,b,c;

scanf("%d,%d,%d",&a,&b,&c);

if(a<=b&&b<=c)

printf("%d,%d,%d",a,b,c);

else if(a<=c&&c<=b)

printf("%d,%d,%d",a,c,b);

else if(b<=a&&a<=c)

printf("%d,%d,%d",b,a,c);

else if(b<=c&&c<=a)

printf("%d,%d,%d",b,c,a);

else if(c<=a&&a<=b)

printf("%d,%d,%d",c,a,b);

else

printf("%d,%d,%d",c,b,a);

}

二冒泡法

#include<stdioh>

#define N 3

main()

{int a[N];

int i,j,t;

for(i=0;i<N;i++)

scanf("%d",&a[i]);

printf("\n");

for(j=1;j<=N-1;j++);

for(i=0;i<N-j;i++);

if(a[i]>a[i+1])

{t=a[i];a[i]=a[i+1];a[i+1]=t;}

printf("The sorted numbers:\n");

for(i=0;i<N;i++);

printf("%d ",a[i]);

printf("\n");

}

三打雷法

#include<stdioh>

#define N 3

main()

{int a[N];

int i,j,t;

for(i=0;i<N;i++)

scanf("%d",&a[i]);

printf("\n");

for(j=0;j<N-1;j++);

for(i=j+1;i<N;i++);

if(a[j]>a[i])

{t=a[j];a[j]=a[i];a[i]=t;}

printf("The sorted numbers:\n");

for(i=0;i<N;i++);

printf("%d ",a[i]);

printf("\n");

}

以上就是关于设X,Y,Z,W均为有符号双字型内存变量,试编写完整汇编语言源程序,实现表达式W=X+Y+36-Z全部的内容,包括:设X,Y,Z,W均为有符号双字型内存变量,试编写完整汇编语言源程序,实现表达式W=X+Y+36-Z、求助c语言小程序!求z=x*y;x,y分别为二进制数和BCD码时怎么写、汇编语言编程:X,Y,Z,W均为带16位带符号整型变量,计算Z = (X * Y) / W + 4*X,编程序实现.求大神!!!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9704772.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存