AHU 汇编 实验六

一、实验名称:实验6 输入一个16进制数,把它转换为10进制数输出

  • 实验目的:

培养汇编中设计子程序的能力

  • 实验过程:

源代码:

data segment

  buff1 db 'Please input a number(H):$'

  buff2 db 30,?,30 dup(?),13,10

  buff3 db 'The consequent is:$'

data ends

code segment

  assume cs:code,ds:data

main proc far

  push ds

  xor ax,ax

  push ax

  mov ax,data

  mov  ds,ax

  call tips1      ;调用第一个字符串,提示用户输入

  call input1     ;调用程序,将数字输入进缓冲区保存

  call get4h      ;将缓冲区的ASCII码转换成实际的二进制

  xor ax,ax

    mov al,byte ptr[buff2+1]                ;di用来计数(处理4位的十六进制)

    mov di,ax

    lea si,buff2+2

    mov bx,0;

    mov bp,1000h            ;dx位权

    call function

  call tips2      ;调用第三个字符串,显示结果

  call btod     ;将缓冲区的二进制转换成10进制ASCII码输出

  mov ah,4ch

  int 21h

  ret

  main endp





  tips1 proc near

   mov dx,offset buff1

   mov ah,9

   int 21h

ret

tips1 endp



tips2 proc near

   mov dx,offset buff3

   mov ah,9

   int 21h

ret

tips2 endp



input1 proc near

    lea dx,buff2

    mov ah,0ah

    int 21h

    mov dl,13

    mov ah,2

    int 21h

    mov dl,10

    mov ah,2

    int 21h

ret

input1 endp





get4h proc near

  lea si,buff2+2   ;将第二个字符串的首地址给si寄存器保存

  mov bx,0         ;用bx当作计数器和相对偏移量

input:

  mov al,byte ptr[si+bx]

  cmp al,30h

  jl exit

  cmp al,39h

  jle dig        ;>='0'&&<='9'

  cmp al,41h     ;<'A',exit     判断输入的合法性

  jl exit

  cmp al,46h     ;>='A'&&<='F'  如果是0~9,就进入dig,如果是A~F就进入hex

  jle hex

  cmp al,61h

  jl exit

  cmp al,66h

  jle shex      ;如果是在a~f之间

  jmp exit



dig:

  sub al,30h

  mov byte ptr[si+bx],al      ;原来的缓冲区位置存放输入的真实数值

  jmp exit



hex:

  sub al,37h    

  mov byte ptr[si+bx],al      ;原来的缓冲区位置存放输入的真实数值

  jmp exit



shex:

  sub al,57h    

  mov byte ptr[si+bx],al      ;原来的缓冲区位置存放输入的真实数值

  jmp exit





exit:

  inc bl

  mov dl,buff2+1

  cmp bl,dl                   ;计数功能

  jz return

  jmp input



return:ret

get4h endp



















function proc near

  lea si,buff2+2      ;用si寄存器保存第二个字符串的首地址

  mov bx,0           

  mov bp,1000h

  xor ax,ax

start0:

  mov al,byte ptr[si]      ;内层循环,用cx计数

start1:

  mul bp               ;存在(DX,AX)

  mov cx,4

  ror bp,cl             ;得到新的位权

  dec di

  add bx,ax

  xor ax,ax   ;清零

  inc si      ;下一个字符

  cmp di,0    ;结束

  je exit1   

  jmp start0



exit1:ret

function endp



btod proc near

    mov ax, bx             ;把bp寄存器的值给ax

    mov cx, 1              ;计数器

    mov bx, 10             ;10作除数

    xor dx,dx

div1:

    idiv bx              

    push dx                ;保存ax/10后的结果,ah存放余数,al存放商

    cmp ax, 0              ;商为0则开始输出

    jz output

    mov dx, 0              ;置余数为0,继续除

    inc cx

    jmp div1

output:

     pop dx               

     add dl, 30h

     mov ah, 2

     int 21h

     loop output



    ret

btod  endp



code ends

end main

实验运行结果:

  • 实验小结:

本次实验,一开始我理解题意错误,以为是分开输出对应的BCD码,这提醒我们看清题意很重要。

在本次代码中,首先我们做一个输入提示:

然后我们把缓冲区输入的所有数,进行真实数值处理

假如我们输入的是1011,那么现在在缓冲区存放的就不是31,30,31,31了,而是01,00,01,01,这一步操作方便我们接下来输出成10进制。

这一步是将二进制数全部乘以它对应的位权,得到实际的十进制数值,方法就是,向左移动寄存器,将其乘以对应位权后保存下来。

这一步就是,我们把最后的数分别输出,方法就是除以10得到余数,然后把余数压栈最后输出。

这是本学期最后一次汇编实验课,但是整体感觉自己的汇编编程能力,还有很多不足,平时还是应该要多上机实验。

相关推荐

  1. execution unit的概念与实现----AGU

    2024-03-16 09:44:04       55 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-16 09:44:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-16 09:44:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-16 09:44:04       87 阅读
  4. Python语言-面向对象

    2024-03-16 09:44:04       96 阅读

热门阅读

  1. 代码随想录算法训练营day60|第十章 单调栈part03

    2024-03-16 09:44:04       45 阅读
  2. 【数据结构和算法】-贪心算法

    2024-03-16 09:44:04       44 阅读
  3. hive逗号分割行列转换

    2024-03-16 09:44:04       46 阅读
  4. 【iOS ARKit】PhysicsMotionComponent

    2024-03-16 09:44:04       39 阅读
  5. android的Framework

    2024-03-16 09:44:04       48 阅读
  6. Mysql隔离级别的实现

    2024-03-16 09:44:04       39 阅读
  7. pip/huggingface/conda常用命令笔记

    2024-03-16 09:44:04       48 阅读