AX寄存器中存放着16位二进制数。试编写一个汇编语言程序,将这4位十六进制数分别转换为相应的ASCⅡ码,并依次存放到PLUS数组的4个字节中去,要求用调用子程序的方法实现

【微机原理】—汇编题

AX寄存器中存放着16位二进制数。试编写一个汇编语言程序,将这4位十六进制数分别转换为相应的ASCⅡ码,并依次存放到PLUS数组的4个字节中去,要求用调用子程序的方法实现。

方法一

DATA  SEGMENT
  PLUS  DB  4 DUP(?)
DATA  ENDS
STACK1 SEGMENT PARA STACK
       DW 20H DUP(0)
STACK1 ENDS
CODE  SEGMENT
  ASSUME CS:CODE,DS:DATA,SS:STACK1
  START:MOV BX,DATA
        MOV DS,BX
        LEA DI,PLUS
        XOR AX,AX
        CALL BINASC
        MOV AH,4CH
        INT 21H
    BINASC PROC
        MOV CX,4
    LOP:PUSH,CX
        MOV CL,4
        ROL AX,CL
        POP CX
        MOV DL,AL
        AND DL,1111B
        ADD DL,30H
        MOV [DI],DL
        INC DI
        LOOP LOP
        RET
      BINASC ENDP
     CODE ENDS
       END START
        
        

方法二

DATA  SEGMENT
 PLUS DB 4 DUP(?)
DATA  ENDS
CODE SEGMENT
 ASSUME CS:CODE,DS:DATA
 START:MOV BX,DATA
       MOV DS,BX
       LEA SI,PLUS
       MOV BL,AL
       AND BL,0FH
       CALL ASCII
       SHR BL,4
       AND BL,0FH
       CALL ASCII
       MOV AL,AH
       MOV BL,AL
       AND BL,0FH
       CALL ASCII
       SHR BL,4
       AND BL,0FH
       CALL ASCII
       MOV AL,AH
       MOV AH,4CH
       INT 21H
  ASCII PROC
       MOV [SI],BL
       ADD [SI],30H
       INC SI
       RET
   ASCII ENDP
  CODE ENDS
     END START
     
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
5.1编写一个汇编语言程序要求对键盘输入的小写字母用大写字母显示出来。 5.2 编写程序,从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序输出 5.3 将AX寄存器16分成4组,每组4,然后把这四组分别放在AL、BL、CL、DL。 5.4 编写程序要求比较两个字符串STRING1和STRING2所含字符是否相同,若相同则显示‘MATCH’,若不相同则显示‘NOT MATCH’。 5.5 编写程序要求能从键盘接收一个N,然后响铃N次。 5.6 编写程序,将一个包含有20个据的数组M分成两个数组:正数组P和负数组N,并分别把这两个数组据的个显示出来。 5.7 编制一个汇编语言程序,求出首地址为DATA的100D字数组的最小偶,并把它放在AX。 5.8 把AX存放16二进制K看作是8个二进制的“四分之一字节”。编写一个程序要求一下值为3(即11B)的四分之一字节,并将该在终端上显示出来。 5.9 编写汇编语言程序要求从键盘接收一个十六进制,并在终端上显示与它等值的二进制。 5.10 设有一段英文,其字符变量名为ENG,并以$字符结束。编写程序,查对单词SUN在该文的出现次,并以格式”SUNXXXX“显示出次。 5.11 从键盘输入一系列以$为结束的字符串,然后对其的非字字符进行计,并显示出计结果。 5.12 有一个首地址为MEM的100D字数组编制程序删除数组所有为零的项,并将后续项向前压缩,最后将数组的剩余部分补上零。 5.13 在STRING到STRING+99单元存放一个字符串,编制一程序该字符串是否存在字,如有,则把CL的第五置1,否则置0. 5.14 在首地址为TABLE的数组按递增次序存放着100H个16编写一个程序把出现次最多的及其出现的次分别放在AX和CX。 5.15 据段已定义了一个有N个字据的数组M,编写程序求出M绝对值最大的,把它放在据段的M+2n单元,并将该的偏移地址存放在M+2(n+1)单元。 5.16 在首地址为DATA的字数组存放了100H个16编写一个程序求出它们的平均值放在AX寄存器;并求出数组有多少个小于此平均值,将结果放在BX寄存器。 5.17 编写一个程序,把AX十六进制数转换为ASCII码,并将对应的ASCII码依次存放到MEM数组的四个字节如:当(AX)=2A49H时,程序执行完后,MEM的4个字节的内容为39H,34H,41H和32H。 5.18 把0~100D之间的30个存入以GRADE为首地址的30个字数组,GRADE+i表示学号i+1的学生的成绩。另一个数组RANK为30个学生的名次表,其RANK+i的内容是学号为i+1的学生的名次。编写程序,根据GRADE的学生成绩,将学生名次填入RANK数组。 5.19 已知数组A包含15个互不相等的整编写程序,把既在A又在B出现的整存在于数组C。 5.20 设在A,B和C单元存放着三个,若三个都不是0,则求出三树之和并存放于D单元;其一个为0,则把其他两个也清零。编写程序
要使用XLAT将任意一十进制数转换为对应的ASC,需要先将该值存储到AL寄存器,并将该值作为偏移地址,在一个256字节的查找表查找对应的值,并将其存储回AL寄存器。 下面是一个程序,用于将任意一十进制数转换为对应的ASC: ``` section .data lookup_table db '0123456789' ; ASC查找表 section .bss input_num resb 1 ; 存储输入的十进制 section .text global _start _start: ; 从标准输入读取一个十进制,存储到input_num变量 mov eax, 3 ; 系统调用号3表示从标准输入读取据 mov ebx, 0 ; 文件描述符为0,表示标准输入 mov ecx, input_num ; 存储输入的变量 mov edx, 1 ; 读取1个字节 int 0x80 ; 调用系统断 ; 将input_num变量存储的十进制数转换为ASC mov al, byte [input_num] ; 将input_num变量字节读取到AL寄存器 sub al, '0' ; 将AL寄存器值减去字符'0'的ASC,获得对应的字 add al, lookup_table ; 将AL寄存器值作为偏移地址,在查找表查找对应的ASC mov byte [input_num], al ; 将查找到的ASC存储回input_num变量 ; 输出转换后的ASC mov eax, 4 ; 系统调用号4表示向标准输出输出据 mov ebx, 1 ; 文件描述符为1,表示标准输出 mov ecx, input_num ; 输出input_num变量据 mov edx, 1 ; 输出1个字节 int 0x80 ; 调用系统断 ; 退出程序 mov eax, 1 ; 系统调用号1表示退出程序 xor ebx, ebx ; 返回值为0 int 0x80 ; 调用系统断 ``` 在上面的示程序,我们先从标准输入读取一个十进制,存储到input_num变量。然后将input_num变量存储的十进制数转换为ASC,具体步骤如下: 1. 将input_num变量字节读取到AL寄存器。 2. 将AL寄存器值减去字符'0'的ASC,获得对应的字。 3. 将AL寄存器值作为偏移地址,在查找表查找对应的ASC。 4. 将查找到的ASC存储回input_num变量。 最后,我们将转换后的ASC输出到标准输出,然后退出程序

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值