汇编语言--输入两位十六进制数,输出其十进制值

网友投稿 944 2022-05-29

输入两位十六进制数,输出其十进制值

题目:

输入:ff

输出:255

输入:12

输出:018

(默认字符为小写)

方法一

代码

stack segment stack ends data segment string_1 db 'please input a num: $' string_2 db 0ah,0dh,'the result is : $' result db 0,0,0 ;3个0分别用来存储转换10进制后的值 因为最大为255 所以有三位 data ends code segment assume cs:code,ds:data,ss:stack start: mov ax,data mov ds,ax ;显示提示语句 lea dx,string_1 mov ah,09h int 21h ;从键盘上读第一个字符 mov ah,01h int 21h ;先减去30h 再判断是数字 还是a~f sub al,30h cmp al,10 jb shuzi ;是数字 跳转 ;是字母a~f 则还要再减去27h sub al,27h mov cl,4 shl al,cl ;左移4位,相当于乘以16 mov bl,al jmp in_2 shuzi: mov cl,4 shl al,cl mov bl,al ;输入第二个字符 in_2: mov ah,01h int 21h sub al,30h cmp al,10 jb shuzi_2 sub al,27h add bl,al jmp change shuzi_2: add bl,al ;开始进制转换 change: mov bh,0 mov ax,bx mov bx,offset result+2 mov cx,3 mov si,10 ;转换方法就是 循环除以10 得到每个位置的数 ;比如255 255%10=5 25%5=5 2%5=2 这样就把255分成了2 5 5 了 do: div si mov [bx],dl mov dx,0 ;因为除以的是si 16位的,所以被除数为32位,就是高16位为dx,低16位为ax,但dx会用来存余数,所以需要及时对dx清零 dec bx mov ah,0 loop do ;显示结束语句 lea dx,string_2 mov ah,09h int 21h mov bx,offset result mov cx,3 shuchu: mov dl,[bx] add dl,30h mov ah,02h int 21h inc bx loop shuchu mov ax,4c00h int 21h code ends end start

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

结果

改进版

stack segment db 10 dup(?) stack ends data segment string_1 db 'please input a num: $' string_2 db 0ah,0dh,'the result is: $' result db 0,0,0 data ends code segment assume cs:code,ss:stack,ds:data start: mov ax,data mov ds,ax lea dx,string_1 mov ah,09h int 21h mov cx,2 xor bl,bl input: push cx mov cl,4 mov ah,01h int 21h shl bl,cl sub al,30h cmp al,10 jb shuzi sub al,27h shuzi: add bl,al pop cx loop input mov bh,0 mov ax,bx mov bl,10 mov cx,3 mov si,offset result+2 change: div bl mov [si],ah dec si mov ah,0 loop change lea dx,string_2 mov ah,09h int 21h mov cx,3 mov si,offset result output: mov dl,[si] add dl,30h mov ah,02h int 21h inc si loop output mov ax,4c00h int 21h code ends end start

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

方法二:

DATAS SEGMENT bin dw 10 dup(?) ;存放二进制结果 buf db 5 dup(?) ;存放十进制数 各个数位上的数值 如100,存放为 1,0,0 msg1 db 'please input a hex number',13,10,'$' msg2 db 'the dec number:',13,10,'$' crlf db 13,10,'$' ;回车换行 DATAS ENDS stack segment db 10 dup(?) stack ends CODES SEGMENT ASSUME CS:CODES,DS:DATAS mov cx,2 START: push cx MOV AX,DATAS MOV DS,AX mov bx,0 ;初始化bx LEA dx,msg1 ;输出提示字符串 mov ah,9 int 21h input: mov ah,1 ;输入一个字符 int 21h sub al,30h ;把al中的ascii码转换成数值 jl init cmp al,10 ;输入的数在0-9之间跳转 jl toBin sub al,27h ;再转换为a-f cmp al,0ah ;输入的字符比a小 jl init ;结束输入 cmp al,10h ;输入的字符比f大 jge init ;结束输入 toBin: ;转换为二进制,把输入组合成意义上的数值 mov cl,4 shl bx,cl ;bx左移4位 mov ah,0 add bx,ax ;把输入后并从ascii码转换来的值与bx相加 mov bin,bx ;转换成二进制数后存到内存bin jmp input ;继续输入 init: ;初始化,准备转换 mov ax,bin mov bx,10 mov si,4 ;循环四次,最大到万位 toDec: ;转为各个数位上的数值,如100转换为1,0,0 百位为1... mov dx,0 div bx ;除10法得到各个位上的数值 mov [buf+si],dl ;余数为该位上的值,第一次循环为个位,第二次为十位...;存到内存中 dec si cmp ax,0 ;商是否为0,为0算法结束 ja toDec lea dx,crlf ;显示提示 mov ah,9 int 21h lea dx,msg2 mov ah,9 int 21h output: ;输出内存中存放的各个数位上的数值 inc si mov dl,[buf+si] add dl,30h ;转为ascii mov ah,2 int 21h cmp si,4 jb output mov cx,0 pop cx loop START MOV AH,4CH INT 21H CODES ENDS END START

1

2

3

4

5

6

7

8

9

汇编语言--输入两位十六进制数,输出其十进制值

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

总结

计算机存储数据其实是以二进制数存储的,但是在debug模式下,我们看到的数都是以十六进制显示。

键盘输入其实存储的是对应的ASCII值,比如输入:f 其实存的是:66h

为了使输入:f 计算机存储的也是f,需要-57h 如果是数字的话,需要 -30h

这里是两位十六进制的数,输入一个字符后,在最后计算结果的时候,其实是第一个字符乘以16再加上第二个字符,在计算机中,乘以十六,相当于左移四位。所以在这里我的方法是:获得第一个字符后,左移四位,在与第二个字符进行相加。得到的就是我们需要的。

输出也是需要ASCII值,记得+30h

div的用法需要搞清楚

汇编语言

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Win7 用 Eclipse 配置 JSP 开发环境详细教程
下一篇:容器镜像的构建和调试指南
相关文章