鱼C论坛

 找回密码
 立即注册
查看: 2063|回复: 16

[已解决]键盘上分别输入3个小于99的两位十进制数,把其中数值最大的数以二进制形式显示出来

[复制链接]
发表于 2019-6-18 11:25:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
那位大佬可以求求我,就像图片张的那样,但要以二进制输出
最佳答案
2019-6-18 20:52:07
  1. assume cs:code, ds:data

  2. stack segment
  3.         db 512 dup(0)
  4. stack ends

  5. data segment
  6. msg1        db 'Please enter a decimal number first: ', 0
  7. msg2        db 'Please enter a decimal number second: ', 0
  8. msg3        db 'Please enter a decimal number third: ', 0
  9. msg4        db 'The maximum value is: ', 0
  10. data ends

  11. code segment
  12. ; void put_char(char ch)
  13. ; ax: ch
  14. put_char:
  15.         mov        dl, al
  16.         mov        ah, 2
  17.         int        21h
  18.         ret
  19.        
  20. ; void put_string(const char *str)
  21. ; ax: str
  22. put_string:
  23.         push        bx
  24.         mov        bx, ax
  25.         xor        ax, ax
  26. @@:
  27.         mov        al, [bx]
  28.         cmp        al, 0
  29.         je        @F
  30.         call        put_char
  31.        
  32.         inc        bx
  33.         jmp        @B
  34. @@:
  35.         pop        bx
  36.         ret
  37.        
  38. ; uint16_t get_number(void)
  39. get_number:
  40.         push        bx
  41.         push        si
  42.        
  43.         xor        si, si
  44.         xor        bx, bx
  45. @@:
  46.         mov        ah, 1        ; 键盘输入
  47.         int        21h
  48.         mov        bl, al
  49.         cmp        bl, 0dh
  50.         je        @F
  51.        
  52.         ; si = si * 10 + 当前数位上的数字
  53.         mov        ax, 10
  54.         xor        dx, dx
  55.         mul        si
  56.         mov        si, ax
  57.         sub        bx, '0'
  58.         add        si, bx
  59.         jmp        @B
  60. @@:
  61.         mov        ax, 0ah                ; newline
  62.         call        put_char
  63.        
  64.         mov        ax, si
  65.         pop        si
  66.         pop        bx
  67.         ret
  68.        
  69. ; uint16_t max(uint16_t a, uint16_t b)
  70. ; ax: a
  71. ; cx: b
  72. max:
  73.         cmp        ax, cx
  74.         ja        @F
  75.         mov        ax, cx
  76. @@:
  77.         ret
  78.        
  79. ; void print_binary(uint16_t a)
  80. ; ax: a
  81. print_binary:
  82.         push        bx
  83.         push        si
  84.        
  85.         mov        bx, ax
  86.         mov        cx, 16
  87.         mov        si, 8000h
  88. L1:
  89.         mov        ax, '0'
  90.         test        bx, si
  91.         jz        @F
  92.         mov        ax, '1'
  93. @@:
  94.         push        cx
  95.         call        put_char
  96.         pop        cx
  97.        
  98.         shr        si, 1
  99.         loop        L1
  100.        
  101.         pop        si
  102.         pop        bx
  103.         ret
  104.        
  105. start:
  106.         mov        ax, stack
  107.         mov        ss, ax
  108.         mov        sp, 512
  109.         mov        ax, data
  110.         mov        ds, ax
  111.        
  112.         mov        ax, offset msg1
  113.         call        put_string
  114.         call        get_number
  115.         push        ax
  116.        
  117.         mov        ax, offset msg2
  118.         call        put_string
  119.         call        get_number
  120.         push        ax
  121.        
  122.         mov        ax, offset msg3
  123.         call        put_string
  124.         call        get_number
  125.        
  126.         pop        cx
  127.         call        max
  128.         pop        cx
  129.         call        max
  130.         push        ax
  131.        
  132.         mov        ax, offset msg4
  133.         call        put_string
  134.         pop        ax
  135.         call        print_binary
  136.        
  137.         mov        ax, 4c00h
  138.         int        21h
  139. code ends
  140. end start
复制代码

  1. D:\Masm615>main
  2. Please enter a decimal number first: 15
  3. Please enter a decimal number second: 99
  4. Please enter a decimal number third: 98
  5. The maximum value is: 0000000001100011
  6. D:\Masm615>
复制代码
kkk.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-6-18 11:44:01 | 显示全部楼层
本帖最后由 凌九霄 于 2019-6-18 11:51 编辑
  1. l = []
  2. for i in ['first', 'second', 'third']:
  3.     t = int(input('Please ebter a decimal number {}:'.format(i)))
  4.     l.append(t)

  5. print('The maximum value is:', bin(sorted(l)[-1]))
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-18 11:52:14 | 显示全部楼层

用汇编语言写(8086),不过还是谢谢你的解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-18 11:53:34 | 显示全部楼层
水柔炎 发表于 2019-6-18 11:52
用汇编语言写(8086),不过还是谢谢你的解答

抱歉,没注意到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-18 11:55:42 | 显示全部楼层

没事,谢谢你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-18 15:27:28 | 显示全部楼层
我可以帮你提供一下思路,代码要自己写
1.利用int 21h的二号功能,循环输入,得到十进制数的ASCII码,保存起来,输入回车结束(其中可以再设置一个错误输入重新输入的函数)
2.得到三个数的ASCII码后,接下来就是比较了,可以把得到的数的十位数先比较,如果相同,再比较个位数,这样可以得到最大的数,记得保存输入得到的字符要以字的形式存放,这样,如果输入的只有一位数,可以把高位置0
3.得到的最大的数要变成十六进制,首先,把十位和个位分别减去30h(因为0~9的16进制ASCII码为30h~39h),然后十位再乘于10h,得到一个16进制的最大数
4.最后一步,把16进制变为2进制,首先,利用循环左移rol,它可以把最高位的数给进位寄存器CF,利用这个特点,我们可以得到16进制数的二进制
设置循环次数,16次,然后循环左移你得到的最大数,然后把dl置为0,adc dl,30h(因为最高位保存在CF中,adc可以把CF中的内容加进来,30h是变成ASCII码的形式,方便输出),调用int 21h的2号功能,输出
还有什么不懂的可以问,思路在这里了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-18 20:52:07 | 显示全部楼层    本楼为最佳答案   
  1. assume cs:code, ds:data

  2. stack segment
  3.         db 512 dup(0)
  4. stack ends

  5. data segment
  6. msg1        db 'Please enter a decimal number first: ', 0
  7. msg2        db 'Please enter a decimal number second: ', 0
  8. msg3        db 'Please enter a decimal number third: ', 0
  9. msg4        db 'The maximum value is: ', 0
  10. data ends

  11. code segment
  12. ; void put_char(char ch)
  13. ; ax: ch
  14. put_char:
  15.         mov        dl, al
  16.         mov        ah, 2
  17.         int        21h
  18.         ret
  19.        
  20. ; void put_string(const char *str)
  21. ; ax: str
  22. put_string:
  23.         push        bx
  24.         mov        bx, ax
  25.         xor        ax, ax
  26. @@:
  27.         mov        al, [bx]
  28.         cmp        al, 0
  29.         je        @F
  30.         call        put_char
  31.        
  32.         inc        bx
  33.         jmp        @B
  34. @@:
  35.         pop        bx
  36.         ret
  37.        
  38. ; uint16_t get_number(void)
  39. get_number:
  40.         push        bx
  41.         push        si
  42.        
  43.         xor        si, si
  44.         xor        bx, bx
  45. @@:
  46.         mov        ah, 1        ; 键盘输入
  47.         int        21h
  48.         mov        bl, al
  49.         cmp        bl, 0dh
  50.         je        @F
  51.        
  52.         ; si = si * 10 + 当前数位上的数字
  53.         mov        ax, 10
  54.         xor        dx, dx
  55.         mul        si
  56.         mov        si, ax
  57.         sub        bx, '0'
  58.         add        si, bx
  59.         jmp        @B
  60. @@:
  61.         mov        ax, 0ah                ; newline
  62.         call        put_char
  63.        
  64.         mov        ax, si
  65.         pop        si
  66.         pop        bx
  67.         ret
  68.        
  69. ; uint16_t max(uint16_t a, uint16_t b)
  70. ; ax: a
  71. ; cx: b
  72. max:
  73.         cmp        ax, cx
  74.         ja        @F
  75.         mov        ax, cx
  76. @@:
  77.         ret
  78.        
  79. ; void print_binary(uint16_t a)
  80. ; ax: a
  81. print_binary:
  82.         push        bx
  83.         push        si
  84.        
  85.         mov        bx, ax
  86.         mov        cx, 16
  87.         mov        si, 8000h
  88. L1:
  89.         mov        ax, '0'
  90.         test        bx, si
  91.         jz        @F
  92.         mov        ax, '1'
  93. @@:
  94.         push        cx
  95.         call        put_char
  96.         pop        cx
  97.        
  98.         shr        si, 1
  99.         loop        L1
  100.        
  101.         pop        si
  102.         pop        bx
  103.         ret
  104.        
  105. start:
  106.         mov        ax, stack
  107.         mov        ss, ax
  108.         mov        sp, 512
  109.         mov        ax, data
  110.         mov        ds, ax
  111.        
  112.         mov        ax, offset msg1
  113.         call        put_string
  114.         call        get_number
  115.         push        ax
  116.        
  117.         mov        ax, offset msg2
  118.         call        put_string
  119.         call        get_number
  120.         push        ax
  121.        
  122.         mov        ax, offset msg3
  123.         call        put_string
  124.         call        get_number
  125.        
  126.         pop        cx
  127.         call        max
  128.         pop        cx
  129.         call        max
  130.         push        ax
  131.        
  132.         mov        ax, offset msg4
  133.         call        put_string
  134.         pop        ax
  135.         call        print_binary
  136.        
  137.         mov        ax, 4c00h
  138.         int        21h
  139. code ends
  140. end start
复制代码

  1. D:\Masm615>main
  2. Please enter a decimal number first: 15
  3. Please enter a decimal number second: 99
  4. Please enter a decimal number third: 98
  5. The maximum value is: 0000000001100011
  6. D:\Masm615>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-19 13:05:21 | 显示全部楼层
暗pluto 发表于 2019-6-18 15:27
我可以帮你提供一下思路,代码要自己写
1.利用int 21h的二号功能,循环输入,得到十进制数的ASCII码,保存 ...

好的,谢谢啦,我已经做好了
data segment
  A db 0
  B db 0
  D db 0
  buf db 3
      db 0
  inn db 3 dup(0)
  msg0 db 0dh, 0ah, 'Please enter a decimal number(10-99):$'
  msg1 db 0dh, 0ah, 'The max number (in Binary) is :$'
data ends

assume cs:code, ds:data
code segment
start:
  mov ax, data
  mov ds, ax

  lea si, A
  call readdecimal
  lea si, B
  call readdecimal
  lea si, D
  call readdecimal

  xor bx, bx
  mov al, A
  cmp al, B
  ja m1     ;A>B
  cmp al, D ;A<B
  ja m4     ;B>A>D
  mov al, B ;B>A, D>A, B>D?
  cmp al, D
  ja m5     ;B>D>A
  mov bl, D
  jmp printit

m1: ;A>B, then judge B>D?
  mov al, B
  cmp al, D
  jb m2     ; B<D
  mov bl, A ; found it, then print it
  jmp printit

m2:  ;A>B, D>B, then judge A>D?
  mov al, A
  cmp al, D
  ja  m3   ;A>D, found D
  mov bl, D ;A<D, found A
  jmp printit

m3:
  mov bl, A
  jmp printit

m4:
  mov bl, B
  jmp printit
m5:
  mov bl, B
  jmp printit
printit:
  mov ah,9
  lea dx, msg1
  int 21h
  call printbin

  mov ax, 4c00h
  int 21h  

;read decimal
;store to (si)
readdecimal proc near
  lea dx, msg0
  mov ah, 9
  int 21h

  lea dx, buf
  mov ah,10
  int 21h

  mov byte ptr [si], 0
  mov dl, 10
  xor cx, cx
  mov cl, buf+1
  xor bx, bx
r0:
  mov al, inn[bx]
  and al, 0fh
  xchg al, [si]
  mul dl
  add [si], al
  inc bx
  loop r0
   
  ret
readdecimal endp

;print(bx)
printbin proc near
  mov cx, 16
  mov ah,0eh
p0:
  rol bx, 1
  mov al, bl
  and al, 01h
  xor al,30h
  int 10h
  loop p0
  ret
printbin endp
code ends
end start

你看看有没有问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-19 13:07:11 | 显示全部楼层

谢谢你亲自动手把代码都写出来了,
你看看我上面发的代码,有没有错误的地方
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-19 13:55:59 | 显示全部楼层
水柔炎 发表于 2019-6-19 13:07
谢谢你亲自动手把代码都写出来了,
你看看我上面发的代码,有没有错误的地方

从结果来看,应该没有问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-19 13:57:06 | 显示全部楼层
人造人 发表于 2019-6-19 13:55
从结果来看,应该没有问题

能说一下你代码的思路吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-19 14:02:30 | 显示全部楼层
暗pluto 发表于 2019-6-18 15:27
我可以帮你提供一下思路,代码要自己写
1.利用int 21h的二号功能,循环输入,得到十进制数的ASCII码,保存 ...

能具体解释一下第三部吗?
3.得到的最大的数要变成十六进制,首先,把十位和个位分别减去30h(因为0~9的16进制ASCII码为30h~39h),然后十位再乘于10h,得到一个16进制的最大数
十位为什么要再乘以10h??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-19 16:03:16 | 显示全部楼层
水柔炎 发表于 2019-6-19 14:02
能具体解释一下第三部吗?
3.得到的最大的数要变成十六进制,首先,把十位和个位分别减去30h(因为0~9的 ...

你那里不明白吗?
能理解这个代码吗?

  1. #include <stdio.h>
  2. #include <stdint.h>

  3. uint32_t get_number(void)
  4. {
  5.         int ch;
  6.         uint32_t res = 0;
  7.         while((ch = getchar()) != '\n')
  8.                 res = res * 10 + (ch - '0');
  9.         return res;
  10. }

  11. int main(void)
  12. {
  13.         printf("Please enter a decimal number first: ");
  14.         uint32_t res = get_number();
  15.         printf("%u\n", res);
  16.         return 0;
  17. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-19 16:49:14 | 显示全部楼层
人造人 发表于 2019-6-19 16:03
你那里不明白吗?
能理解这个代码吗?

uint32_t 这个是什么类型的?然后你是看了编译后的代码吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-19 17:40:45 | 显示全部楼层
水柔炎 发表于 2019-6-19 16:49
uint32_t 这个是什么类型的?然后你是看了编译后的代码吗
  1. //
  2. // stdint.h
  3. //
  4. //      Copyright (c) Microsoft Corporation. All rights reserved.
  5. //
  6. // The C Standard Library <stdint.h> header.
  7. //
  8. #pragma once
  9. #define _STDINT

  10. #ifndef RC_INVOKED

  11. #include <vcruntime.h>



  12. typedef signed char        int8_t;
  13. typedef short              int16_t;
  14. typedef int                int32_t;
  15. typedef long long          int64_t;
  16. typedef unsigned char      uint8_t;
  17. typedef unsigned short     uint16_t;
  18. typedef unsigned int       uint32_t;
  19. typedef unsigned long long uint64_t;

  20. typedef signed char        int_least8_t;
  21. typedef short              int_least16_t;
  22. typedef int                int_least32_t;
  23. typedef long long          int_least64_t;
  24. typedef unsigned char      uint_least8_t;
  25. typedef unsigned short     uint_least16_t;
  26. typedef unsigned int       uint_least32_t;
  27. typedef unsigned long long uint_least64_t;

  28. typedef signed char        int_fast8_t;
  29. typedef int                int_fast16_t;
  30. typedef int                int_fast32_t;
  31. typedef long long          int_fast64_t;
  32. typedef unsigned char      uint_fast8_t;
  33. typedef unsigned int       uint_fast16_t;
  34. typedef unsigned int       uint_fast32_t;
  35. typedef unsigned long long uint_fast64_t;

  36. typedef long long          intmax_t;
  37. typedef unsigned long long uintmax_t;

  38. // These macros must exactly match those in the Windows SDK's intsafe.h.
  39. #define INT8_MIN         (-127i8 - 1)
  40. #define INT16_MIN        (-32767i16 - 1)
  41. #define INT32_MIN        (-2147483647i32 - 1)
  42. #define INT64_MIN        (-9223372036854775807i64 - 1)
  43. #define INT8_MAX         127i8
  44. #define INT16_MAX        32767i16
  45. #define INT32_MAX        2147483647i32
  46. #define INT64_MAX        9223372036854775807i64
  47. #define UINT8_MAX        0xffui8
  48. #define UINT16_MAX       0xffffui16
  49. #define UINT32_MAX       0xffffffffui32
  50. #define UINT64_MAX       0xffffffffffffffffui64

  51. #define INT_LEAST8_MIN   INT8_MIN
  52. #define INT_LEAST16_MIN  INT16_MIN
  53. #define INT_LEAST32_MIN  INT32_MIN
  54. #define INT_LEAST64_MIN  INT64_MIN
  55. #define INT_LEAST8_MAX   INT8_MAX
  56. #define INT_LEAST16_MAX  INT16_MAX
  57. #define INT_LEAST32_MAX  INT32_MAX
  58. #define INT_LEAST64_MAX  INT64_MAX
  59. #define UINT_LEAST8_MAX  UINT8_MAX
  60. #define UINT_LEAST16_MAX UINT16_MAX
  61. #define UINT_LEAST32_MAX UINT32_MAX
  62. #define UINT_LEAST64_MAX UINT64_MAX

  63. #define INT_FAST8_MIN    INT8_MIN
  64. #define INT_FAST16_MIN   INT32_MIN
  65. #define INT_FAST32_MIN   INT32_MIN
  66. #define INT_FAST64_MIN   INT64_MIN
  67. #define INT_FAST8_MAX    INT8_MAX
  68. #define INT_FAST16_MAX   INT32_MAX
  69. #define INT_FAST32_MAX   INT32_MAX
  70. #define INT_FAST64_MAX   INT64_MAX
  71. #define UINT_FAST8_MAX   UINT8_MAX
  72. #define UINT_FAST16_MAX  UINT32_MAX
  73. #define UINT_FAST32_MAX  UINT32_MAX
  74. #define UINT_FAST64_MAX  UINT64_MAX

  75. #ifdef _WIN64
  76.     #define INTPTR_MIN   INT64_MIN
  77.     #define INTPTR_MAX   INT64_MAX
  78.     #define UINTPTR_MAX  UINT64_MAX
  79. #else
  80.     #define INTPTR_MIN   INT32_MIN
  81.     #define INTPTR_MAX   INT32_MAX
  82.     #define UINTPTR_MAX  UINT32_MAX
  83. #endif

  84. #define INTMAX_MIN       INT64_MIN
  85. #define INTMAX_MAX       INT64_MAX
  86. #define UINTMAX_MAX      UINT64_MAX

  87. #define PTRDIFF_MIN      INTPTR_MIN
  88. #define PTRDIFF_MAX      INTPTR_MAX

  89. #ifndef SIZE_MAX
  90.     #define SIZE_MAX     UINTPTR_MAX
  91. #endif

  92. #define SIG_ATOMIC_MIN   INT32_MIN
  93. #define SIG_ATOMIC_MAX   INT32_MAX

  94. #define WCHAR_MIN        0x0000
  95. #define WCHAR_MAX        0xffff

  96. #define WINT_MIN         0x0000
  97. #define WINT_MAX         0xffff

  98. #define INT8_C(x)    (x)
  99. #define INT16_C(x)   (x)
  100. #define INT32_C(x)   (x)
  101. #define INT64_C(x)   (x ## LL)

  102. #define UINT8_C(x)   (x)
  103. #define UINT16_C(x)  (x)
  104. #define UINT32_C(x)  (x ## U)
  105. #define UINT64_C(x)  (x ## ULL)

  106. #define INTMAX_C(x)  INT64_C(x)
  107. #define UINTMAX_C(x) UINT64_C(x)



  108. #endif // RC_INVOKED

  109. /*
  110. * Copyright (c) 1992-2012 by P.J. Plauger.  ALL RIGHTS RESERVED.
  111. * Consult your license regarding permissions and restrictions.
  112. V6.00:0009 */
复制代码


  1. typedef unsigned int       uint32_t;
复制代码




我不知道应该如何给你解释这个
  1. res = res * 10 + (ch - '0');
复制代码


qq: 1440332527
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-20 11:12:15 | 显示全部楼层
水柔炎 发表于 2019-6-19 14:02
能具体解释一下第三部吗?
3.得到的最大的数要变成十六进制,首先,把十位和个位分别减去30h(因为0~9的 ...

因为保存的是10位数一个位数,而不是真正的十位,例如:11    在代码中,十位保存的是1,而不是10,所以要乘10,把1变成真正的10位数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-20 21:54:45 | 显示全部楼层
暗pluto 发表于 2019-6-20 11:12
因为保存的是10位数一个位数,而不是真正的十位,例如:11    在代码中,十位保存的是1,而不是10,所以 ...

你乘以的应该是十进制的10,应该是10,不要H吧
第四部怎么理解呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 16:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表