鱼C论坛

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

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

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

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

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

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

stack segment
        db 512 dup(0)
stack ends

data segment
msg1        db 'Please enter a decimal number first: ', 0
msg2        db 'Please enter a decimal number second: ', 0
msg3        db 'Please enter a decimal number third: ', 0
msg4        db 'The maximum value is: ', 0
data ends

code segment
; void put_char(char ch)
; ax: ch
put_char:
        mov        dl, al
        mov        ah, 2
        int        21h
        ret
        
; void put_string(const char *str)
; ax: str
put_string:
        push        bx
        mov        bx, ax
        xor        ax, ax
@@:
        mov        al, [bx]
        cmp        al, 0
        je        @F
        call        put_char
        
        inc        bx
        jmp        @B
@@:
        pop        bx
        ret
        
; uint16_t get_number(void)
get_number:
        push        bx
        push        si
        
        xor        si, si
        xor        bx, bx
@@:
        mov        ah, 1        ; 键盘输入
        int        21h
        mov        bl, al
        cmp        bl, 0dh
        je        @F
        
        ; si = si * 10 + 当前数位上的数字
        mov        ax, 10
        xor        dx, dx
        mul        si
        mov        si, ax
        sub        bx, '0'
        add        si, bx
        jmp        @B
@@:
        mov        ax, 0ah                ; newline
        call        put_char
        
        mov        ax, si
        pop        si
        pop        bx
        ret
        
; uint16_t max(uint16_t a, uint16_t b)
; ax: a
; cx: b
max:
        cmp        ax, cx
        ja        @F
        mov        ax, cx
@@:
        ret
        
; void print_binary(uint16_t a)
; ax: a
print_binary:
        push        bx
        push        si
        
        mov        bx, ax
        mov        cx, 16
        mov        si, 8000h
L1:
        mov        ax, '0'
        test        bx, si
        jz        @F
        mov        ax, '1'
@@:
        push        cx
        call        put_char
        pop        cx
        
        shr        si, 1
        loop        L1
        
        pop        si
        pop        bx
        ret
        
start:
        mov        ax, stack
        mov        ss, ax
        mov        sp, 512
        mov        ax, data
        mov        ds, ax
        
        mov        ax, offset msg1
        call        put_string
        call        get_number
        push        ax
        
        mov        ax, offset msg2
        call        put_string
        call        get_number
        push        ax
        
        mov        ax, offset msg3
        call        put_string
        call        get_number
        
        pop        cx
        call        max
        pop        cx
        call        max
        push        ax
        
        mov        ax, offset msg4
        call        put_string
        pop        ax
        call        print_binary
        
        mov        ax, 4c00h
        int        21h
code ends
end start
D:\Masm615>main
Please enter a decimal number first: 15
Please enter a decimal number second: 99
Please enter a decimal number third: 98
The maximum value is: 0000000001100011
D:\Masm615>
kkk.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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 | 显示全部楼层    本楼为最佳答案   
assume cs:code, ds:data

stack segment
        db 512 dup(0)
stack ends

data segment
msg1        db 'Please enter a decimal number first: ', 0
msg2        db 'Please enter a decimal number second: ', 0
msg3        db 'Please enter a decimal number third: ', 0
msg4        db 'The maximum value is: ', 0
data ends

code segment
; void put_char(char ch)
; ax: ch
put_char:
        mov        dl, al
        mov        ah, 2
        int        21h
        ret
        
; void put_string(const char *str)
; ax: str
put_string:
        push        bx
        mov        bx, ax
        xor        ax, ax
@@:
        mov        al, [bx]
        cmp        al, 0
        je        @F
        call        put_char
        
        inc        bx
        jmp        @B
@@:
        pop        bx
        ret
        
; uint16_t get_number(void)
get_number:
        push        bx
        push        si
        
        xor        si, si
        xor        bx, bx
@@:
        mov        ah, 1        ; 键盘输入
        int        21h
        mov        bl, al
        cmp        bl, 0dh
        je        @F
        
        ; si = si * 10 + 当前数位上的数字
        mov        ax, 10
        xor        dx, dx
        mul        si
        mov        si, ax
        sub        bx, '0'
        add        si, bx
        jmp        @B
@@:
        mov        ax, 0ah                ; newline
        call        put_char
        
        mov        ax, si
        pop        si
        pop        bx
        ret
        
; uint16_t max(uint16_t a, uint16_t b)
; ax: a
; cx: b
max:
        cmp        ax, cx
        ja        @F
        mov        ax, cx
@@:
        ret
        
; void print_binary(uint16_t a)
; ax: a
print_binary:
        push        bx
        push        si
        
        mov        bx, ax
        mov        cx, 16
        mov        si, 8000h
L1:
        mov        ax, '0'
        test        bx, si
        jz        @F
        mov        ax, '1'
@@:
        push        cx
        call        put_char
        pop        cx
        
        shr        si, 1
        loop        L1
        
        pop        si
        pop        bx
        ret
        
start:
        mov        ax, stack
        mov        ss, ax
        mov        sp, 512
        mov        ax, data
        mov        ds, ax
        
        mov        ax, offset msg1
        call        put_string
        call        get_number
        push        ax
        
        mov        ax, offset msg2
        call        put_string
        call        get_number
        push        ax
        
        mov        ax, offset msg3
        call        put_string
        call        get_number
        
        pop        cx
        call        max
        pop        cx
        call        max
        push        ax
        
        mov        ax, offset msg4
        call        put_string
        pop        ax
        call        print_binary
        
        mov        ax, 4c00h
        int        21h
code ends
end start
D:\Masm615>main
Please enter a decimal number first: 15
Please enter a decimal number second: 99
Please enter a decimal number third: 98
The maximum value is: 0000000001100011
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的 ...

你那里不明白吗?
能理解这个代码吗?
#include <stdio.h>
#include <stdint.h>

uint32_t get_number(void)
{
        int ch;
        uint32_t res = 0;
        while((ch = getchar()) != '\n')
                res = res * 10 + (ch - '0');
        return res;
}

int main(void)
{
        printf("Please enter a decimal number first: ");
        uint32_t res = get_number();
        printf("%u\n", res);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> 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 这个是什么类型的?然后你是看了编译后的代码吗
//
// stdint.h
//
//      Copyright (c) Microsoft Corporation. All rights reserved.
//
// The C Standard Library <stdint.h> header.
//
#pragma once
#define _STDINT

#ifndef RC_INVOKED

#include <vcruntime.h>



typedef signed char        int8_t;
typedef short              int16_t;
typedef int                int32_t;
typedef long long          int64_t;
typedef unsigned char      uint8_t;
typedef unsigned short     uint16_t;
typedef unsigned int       uint32_t;
typedef unsigned long long uint64_t;

typedef signed char        int_least8_t;
typedef short              int_least16_t;
typedef int                int_least32_t;
typedef long long          int_least64_t;
typedef unsigned char      uint_least8_t;
typedef unsigned short     uint_least16_t;
typedef unsigned int       uint_least32_t;
typedef unsigned long long uint_least64_t;

typedef signed char        int_fast8_t;
typedef int                int_fast16_t;
typedef int                int_fast32_t;
typedef long long          int_fast64_t;
typedef unsigned char      uint_fast8_t;
typedef unsigned int       uint_fast16_t;
typedef unsigned int       uint_fast32_t;
typedef unsigned long long uint_fast64_t;

typedef long long          intmax_t;
typedef unsigned long long uintmax_t;

// These macros must exactly match those in the Windows SDK's intsafe.h.
#define INT8_MIN         (-127i8 - 1)
#define INT16_MIN        (-32767i16 - 1)
#define INT32_MIN        (-2147483647i32 - 1)
#define INT64_MIN        (-9223372036854775807i64 - 1)
#define INT8_MAX         127i8
#define INT16_MAX        32767i16
#define INT32_MAX        2147483647i32
#define INT64_MAX        9223372036854775807i64
#define UINT8_MAX        0xffui8
#define UINT16_MAX       0xffffui16
#define UINT32_MAX       0xffffffffui32
#define UINT64_MAX       0xffffffffffffffffui64

#define INT_LEAST8_MIN   INT8_MIN
#define INT_LEAST16_MIN  INT16_MIN
#define INT_LEAST32_MIN  INT32_MIN
#define INT_LEAST64_MIN  INT64_MIN
#define INT_LEAST8_MAX   INT8_MAX
#define INT_LEAST16_MAX  INT16_MAX
#define INT_LEAST32_MAX  INT32_MAX
#define INT_LEAST64_MAX  INT64_MAX
#define UINT_LEAST8_MAX  UINT8_MAX
#define UINT_LEAST16_MAX UINT16_MAX
#define UINT_LEAST32_MAX UINT32_MAX
#define UINT_LEAST64_MAX UINT64_MAX

#define INT_FAST8_MIN    INT8_MIN
#define INT_FAST16_MIN   INT32_MIN
#define INT_FAST32_MIN   INT32_MIN
#define INT_FAST64_MIN   INT64_MIN
#define INT_FAST8_MAX    INT8_MAX
#define INT_FAST16_MAX   INT32_MAX
#define INT_FAST32_MAX   INT32_MAX
#define INT_FAST64_MAX   INT64_MAX
#define UINT_FAST8_MAX   UINT8_MAX
#define UINT_FAST16_MAX  UINT32_MAX
#define UINT_FAST32_MAX  UINT32_MAX
#define UINT_FAST64_MAX  UINT64_MAX

#ifdef _WIN64
    #define INTPTR_MIN   INT64_MIN
    #define INTPTR_MAX   INT64_MAX
    #define UINTPTR_MAX  UINT64_MAX
#else
    #define INTPTR_MIN   INT32_MIN
    #define INTPTR_MAX   INT32_MAX
    #define UINTPTR_MAX  UINT32_MAX
#endif

#define INTMAX_MIN       INT64_MIN
#define INTMAX_MAX       INT64_MAX
#define UINTMAX_MAX      UINT64_MAX

#define PTRDIFF_MIN      INTPTR_MIN
#define PTRDIFF_MAX      INTPTR_MAX

#ifndef SIZE_MAX
    #define SIZE_MAX     UINTPTR_MAX
#endif

#define SIG_ATOMIC_MIN   INT32_MIN
#define SIG_ATOMIC_MAX   INT32_MAX

#define WCHAR_MIN        0x0000
#define WCHAR_MAX        0xffff

#define WINT_MIN         0x0000
#define WINT_MAX         0xffff

#define INT8_C(x)    (x)
#define INT16_C(x)   (x)
#define INT32_C(x)   (x)
#define INT64_C(x)   (x ## LL)

#define UINT8_C(x)   (x)
#define UINT16_C(x)  (x)
#define UINT32_C(x)  (x ## U)
#define UINT64_C(x)  (x ## ULL)

#define INTMAX_C(x)  INT64_C(x)
#define UINTMAX_C(x) UINT64_C(x)



#endif // RC_INVOKED

/*
 * Copyright (c) 1992-2012 by P.J. Plauger.  ALL RIGHTS RESERVED.
 * Consult your license regarding permissions and restrictions.
V6.00:0009 */

typedef unsigned int       uint32_t;



我不知道应该如何给你解释这个
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-7-5 02:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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