VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3375|回复: 11

二进制转换成十进制的汇编程序

[复制链接]

1

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-12-9 10:00:01 | 显示全部楼层 |阅读模式
二进制转换成十进制的汇编程序
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-12-9 18:00:02 | 显示全部楼层
; BIN2DEC.ASM - Converts a 16-bit binary value into four decimal digits.
;        Input:  The binary value in the pair (R1,R0).
;        Output: Four decimal digits in R13 to R10, the most significant in R13.
;        Algorithm:
;                R13 = 0; Increments R13 while (R1,R0)-1000 is positive
;                R12 = 0; Increments R12 while (R1,R0)-100  is positive
;                R11 = 0; Increments R11 while (R1,R0)-10   is positive
;                R10 = R0;

0x0000:        MODEL        A                ; Processor uP1232a

;        For example: 0x2694 = 9.876
        LD        R1, 0x26
        LD        R0, 0x94

DEC2BIN:
        LD        R13, 0
        LD        R12, 0
        LD        R11, 0
        LD        R10, 0

        LD        R3, 0x03
        LD        R2, 0xE8        ; 0x03E8 = 1.000
LOOP1:        INC        R13
        SUB        R0, R2
        SBC        R1, R3                ; R1R0 - 1000
        JP        NC, LOOP1
        DEC        R13
        ADD        R0, R2
        ADC        R1, R3

        LD        R3, 0
        LD        R2, 100
LOOP2:        INC        R12
        SUB        R0, R2
        SBC        R1, R3                ; R1R0 - 100
        JP        NC, LOOP2
        DEC        R12
        ADD        R0, R2
        ADC        R1, R3

        LD        R3, 0
        LD        R2, 10
LOOP3:        INC        R11
        SUB        R0, R2
        SBC        R1, R3                ; R1R0 - 10
        JP        NC, LOOP3
        DEC        R11
        ADD        R0, R2
        ADC        R1, R3

        LD        R10, R0

#align                                ; Aligns code
HALT:        BREAK                        ; Break-point
        GOTO        HALT                ; Stop processing until RESET

; End of file
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-12-9 18:45:01 | 显示全部楼层
8086汇编

btod2是一个过程。在调用过程前,要转化的二进制数先放在了BX寄存器中。disp2是一个显示十进制数的过程。

btod2        proc       
        push ax
        push bx
        push cx
        push dx
        mov cx,10000
        call disp2
        mov cx,1000
        call disp2
        mov cx,100
        call disp2
        mov cx,10
        call disp2
        mov cx,1
        call disp2
        pop dx
        pop cx
        pop bx
        pop ax
        ret
btod2        endp
disp2        proc                        ;显示一位数字的函数
        mov dl,0
again1:        cmp bx,cx
        jb ext1
        inc dl
        sub bx,cx
        jmp again1
ext1:        add dl,30h
        cmp dl,'0'
        mov ah,02h
        int 21h
        ret
disp2        endp
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-12-9 19:00:01 | 显示全部楼层
除十取余即可
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-12-9 19:15:01 | 显示全部楼层
ttyy0785,你的汇编是基于什么写的啊 ??

看了半天,也不象是ARM的 ,不象是C51的,更不是X86系列的~~~~~

赐教~~~~~~谢谢~!
回复

使用道具 举报

1

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-12-9 19:30:01 | 显示全部楼层
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;   
;从键盘上输入一个十进制数据并转换为二进制的子程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    P_GETNEW  PROC                                    
              PUSH BX             ;出口参数:AX=补码表示的二进制数
              PUSH CX             ;说明:负数用“-”引导,数据范围是+32767~-32768
              PUSH DX
              XOR BX,BX           ;BX保存结果
              XOR CX,CX           ;CX为正负标志,0为正,-1为负
              MOV AH,1            ;输入一个字符
              INT 21H
              CMP AL,'+'          ;是“+”,继续输入字符
              JZ READ1
              CMP AL,'-'          ;是“—,设置-1标志
              JNZ READ2
              MOV CX,-1
                                            
    READ1:    MOV AH,1            ;继续输入字符
              INT 21H   
              
    READ2:    CMP AL,'0'          ;不是0~9之间的字符,则输入数据结束
              JB READ3
              CMP AL,'9'
              JA READ3
              SUB AL,30H          ;是0~9之间的字符,则转换为二进制数
              ;利用移位指令,实现数值乘10:BX←BX*10
              SHL BX,1
              MOV DX,BX
              SHL BX,1
              SHL BX,1
              ADD BX,DX
              
              MOV AH,0
              ADD BX,AX           ;已输入数值乘10后,与新输入的数值相加
              JMP READ1           ;继续输入字符  
              
    READ3:    CMP CX,0            ;是负数,进行求补
              JZ READ4
              NEG BX   
              
    READ4:    MOV AX,BX           ;设置出口参数
              POP DX
              POP CX
              POP BX
              RET                 ;子程序返回
    P_GETNEW  ENDP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;二进制数据转换为十进制的输出子程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
P_OUTPUT     PROC                                   
              PUSH AX         ;入口参数:共享变量WTEMP
              PUSH BX
              PUSH DX
              MOV AX,WTEMP    ;取出显示的数据
              TEST AX,AX      ;判断数据是零、正书还是负数
              JNZ  WRITE1
              MOV DL,'0'      ;是‘0’,显示‘0’后退出
              MOV AH,2
              INT 21H
              JMP WRITE5      
  
    WRITE1:   JNS WRITE2         ;是负数,显示“-”
              MOV BX,AX          ;AX数据暂存于BX
              MOV DL,'-'   
              MOV AH,2
              INT 21H
              MOV AX,BX
              NEG AX             ;数据求补(绝对值)
              
    WRITE2:   MOV BX,10
              PUSH BX            ;10压入堆栈,做为推退出标志
              
    WRITE3:   CMP AX,0           ;数据(商)为零,转向显示
              JZ WRITE4
              SUB DX,DX          ;扩展被除数DX.AX
              DIV BX             ;数据除以10
              ADD DL,30H         ;余数(0~9)转换为ASCⅡ码
              PUSH DX            ;数据各位先低位后高位压入堆栈
              JMP WRITE3
              
    WRITE4:   POP DX             ;数据各位先高位后低位弹出堆栈
              CMP DL,10          ;是结束标志10,则退出
              JE WRITE5  
              
              MOV AH,2           ;进行显示
              INT 21H
              JMP WRITE4
              
    WRITE5:   POP DX
              POP BX
              POP AX
               MOV DL,20H
              MOV AH,02H
              INT 21H
              RET               ;子程序返回
   P_OUTPUT   ENDP
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-12-9 20:00:01 | 显示全部楼层
那个是MIPS汇编。:)
回复

使用道具 举报

0

主题

2

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-12-9 21:45:01 | 显示全部楼层
[code=Assembly]data segment
        num         db 01Fh
data ends
       
stack segment STACK
        db 256 dup(0)
        tos label word
stack ends
code segment
        assume cs:code,ds:data
begin:
        mov ax,0d
        mov ax,0dh
        mov ax,data
        mov ds,ax
        mov es,ax
       
        mov ax,stack
        mov ss,ax
        mov sp,offset tos
       
        xor ax,ax
        mov al,num     
        xor cx,cx
;下面是将cout中的数以十进制显示出来
DoDiv:
        mov bl,10  
        div bl     ;al←ax/10的商
                   ;ah←ax/10的余数
        push ax    ;保存结果
        inc cx
        xor ah,ah  ;ah清零,清除余数
        cmp al,0   ;判断商是否为零
        jnz DoDiv
       
DoPrt:
        pop dx      ;dx中保存的是每次除的结果
        xchg dh,dl
        add dl,30h  ;dl中的数字是每次除后的商,将其表示成ascii
        mov ah,2
        int 21h
        loop DoPrt
       
exit:
        mov ax,4c00h ;退出DOS
        int 21h
code ends
        end begin [/code]
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-12-9 22:00:02 | 显示全部楼层
前面的那个没有看明白是什么意思。、。。。
回复

使用道具 举报

0

主题

2

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-12-9 22:15:01 | 显示全部楼层
我的程序是将num     db 01Fh以十进制显示出来
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表