键盘上分别输入3个小于99的两位十进制数,把其中数值最大的数以二进制形式显示出来
那位大佬可以求求我,就像图片张的那样,但要以二进制输出 本帖最后由 凌九霄 于 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]))
凌九霄 发表于 2019-6-18 11:44
用汇编语言写(8086),不过还是谢谢你的解答 水柔炎 发表于 2019-6-18 11:52
用汇编语言写(8086),不过还是谢谢你的解答
抱歉,没注意到{:10_277:} 凌九霄 发表于 2019-6-18 11:53
抱歉,没注意到
没事,谢谢你 我可以帮你提供一下思路,代码要自己写
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号功能,输出
还有什么不懂的可以问,思路在这里了 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,
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> 暗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
jam3 ;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 , 0
mov dl, 10
xor cx, cx
mov cl, buf+1
xor bx, bx
r0:
mov al, inn
and al, 0fh
xchg al,
mul dl
add , 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
你看看有没有问题 人造人 发表于 2019-6-18 20:52
谢谢你亲自动手把代码都写出来了,
你看看我上面发的代码,有没有错误的地方 水柔炎 发表于 2019-6-19 13:07
谢谢你亲自动手把代码都写出来了,
你看看我上面发的代码,有没有错误的地方
从结果来看,应该没有问题
人造人 发表于 2019-6-19 13:55
从结果来看,应该没有问题
能说一下你代码的思路吗? 暗pluto 发表于 2019-6-18 15:27
我可以帮你提供一下思路,代码要自己写
1.利用int 21h的二号功能,循环输入,得到十进制数的ASCII码,保存 ...
能具体解释一下第三部吗?
3.得到的最大的数要变成十六进制,首先,把十位和个位分别减去30h(因为0~9的16进制ASCII码为30h~39h),然后十位再乘于10h,得到一个16进制的最大数
十位为什么要再乘以10h?? 水柔炎 发表于 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;
}
人造人 发表于 2019-6-19 16:03
你那里不明白吗?
能理解这个代码吗?
uint32_t 这个是什么类型的?然后你是看了编译后的代码吗 水柔炎 发表于 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_MININT16_MIN
#define INT_LEAST32_MININT32_MIN
#define INT_LEAST64_MININT64_MIN
#define INT_LEAST8_MAX INT8_MAX
#define INT_LEAST16_MAXINT16_MAX
#define INT_LEAST32_MAXINT32_MAX
#define INT_LEAST64_MAXINT64_MAX
#define UINT_LEAST8_MAXUINT8_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_MAXUINT32_MAX
#define UINT_FAST32_MAXUINT32_MAX
#define UINT_FAST64_MAXUINT64_MAX
#ifdef _WIN64
#define INTPTR_MIN INT64_MIN
#define INTPTR_MAX INT64_MAX
#define UINTPTR_MAXUINT64_MAX
#else
#define INTPTR_MIN INT32_MIN
#define INTPTR_MAX INT32_MAX
#define UINTPTR_MAXUINT32_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
水柔炎 发表于 2019-6-19 14:02
能具体解释一下第三部吗?
3.得到的最大的数要变成十六进制,首先,把十位和个位分别减去30h(因为0~9的 ...
因为保存的是10位数一个位数,而不是真正的十位,例如:11 在代码中,十位保存的是1,而不是10,所以要乘10,把1变成真正的10位数 暗pluto 发表于 2019-6-20 11:12
因为保存的是10位数一个位数,而不是真正的十位,例如:11 在代码中,十位保存的是1,而不是10,所以 ...
你乘以的应该是十进制的10,应该是10,不要H吧
第四部怎么理解呢?
页:
[1]