【汇编】将ASCII码表示的十进制数转换成二进制数


程序要求




流程图




汇编代码


STACK1  SEGMENT STACK 
         DW 256 DUP(?) 
STACK1  ENDS 

DATA    SEGMENT 

BUF     DB    30H,30H,30H,31H,32H

DATA    ENDS 

CODE SEGMENT 

    ASSUME CS:CODE,DS:DATA 
    
START:  MOV  AX,DATA 
        MOV  DS,AX 
        MOV  SI,OFFSET BUF  ;把BUF的偏移地址存到SI中去
        MOV  BX,000AH 
          MOV  CX,0004H    ;  cx作为循环控制计数器

        MOV  AH,00H 
        MOV  AL,[SI] 

        SUB  AL,30H 

A1:     IMUL BX 

        ADD  AL,[SI+01] 

        SUB  AL,30H 

        INC  SI 

        LOOP A1    
		
        MOV [SI],AX

        CALL SHOW  ;调用子程序

        MOV  AX,4C00H 

        INT  21H    

SHOW    PROC NEAR     ; 输出到屏幕,用16进制表示

        MOV  AL,DS:[SI]

        AND  AL,0F0H                 

        MOV  CL,4
        SHR  AL,CL 

        CMP  AL,0AH                  

        JB   C2        

        ADD  AL,07H    

C2:     ADD  AL,30H    

        MOV  DL,AL                   
        MOV  AH,02H 

        INT  21H 

        MOV  AL,DS:[SI] 

        AND  AL,0FH                  

        CMP  AL,0AH 

        JB   C3 

       ADD  AL,07H

C3:     ADD  AL,30H 

        MOV  DL,AL                   

        MOV  AH,02H 

        INT  21H 

        RET
          
 SHOW  ENDP  

CODE ENDS 

     END START 


相关知识:

LOOP指令    1.CX=CX-1   2.判断cx中的值,不为0,执行标号程序  A1,   为0,向下执行   (即执行 MOV  [SI],AX)

运行结果:




debug分析


1.程序运行到  MOV [SI],AX 的时候,已经完成循环,这个指令是把AX的内容存到SI对应的内存单元中,由SI的值可以知道已经循环了4次





2.观察内存中内容的变化

-D  查看内存数据

-T 单步执行



下面是用x86汇编语言实现将ASCII码表示十进制换为二进制的代码示例: ```assembly section .data num db '123' ; 待换的十进制 len equ $-num ; 获取num字符串长度 section .bss bin resb 32 ; 存储二进制组 section .text global _start _start: mov esi, num ; 从num字符串中读取待换的十进制 mov ecx, len ; 获取字符串长度 xor eax, eax ; 用eax来存储换后的二进制,初始化为0 mov ebx, 10 ; ebx存储除,即10 parse_loop: cmp byte [esi], 0 ; 判断是否到达字符串结尾 je end_parse movzx edx, byte [esi] ; 将当前字符换为字 sub edx, 48 ; 将字符换为字,'0'的ASCII码为48 mul ebx ; 将当前字乘以10 add eax, edx ; 将当前字加入到换后的结果中 inc esi ; 移动到下一个字符 loop parse_loop ; 循环处理字符串中的所有字符 end_parse: mov edi, bin ; 将edi指向存储二进制组 mov ecx, 32 ; 将ecx设置为32,因为二进制最多32位 convert_loop: test eax, eax ; 测试eax的最低位是否为1 jz store_zero ; 如果为0,则跳到store_zero mov byte [edi], '1' ; 如果为1,则将'1'存入组 jmp next_bit ; 跳到next_bit store_zero: mov byte [edi], '0' ; 如果为0,则将'0'存入组 next_bit: shr eax, 1 ; 将eax右移一位,处理下一位 inc edi ; 指向组的下一个元素 loop convert_loop ; 循环处理所有位 ; 将换后的二进制存入bin组中 mov eax, 4 mov ebx, 1 mov ecx, bin mov edx, 32 int 0x80 ; 退出程序 mov eax, 1 xor ebx, ebx int 0x80 ``` 这段代码将ASCII码表示十进制字符串"123"换为32位二进制字符串"00000000000000000000000001111011",并将其打印到屏幕上。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值