【个人笔记】汇编各进制输入与输出

您所在的位置:网站首页 十六进制的数字表示形式 【个人笔记】汇编各进制输入与输出

【个人笔记】汇编各进制输入与输出

2023-06-08 01:36| 来源: 网络整理| 查看: 265

二进制转十六进制

 这段汇编代码的主要功能是将寄存器BX中的16位数逐位按照十六进制逆时针旋转一圈(4位),并将结果打印在屏幕上,输出结果的形式为16进制数字。整个过程通过循环、移位、比较、加减来实现

1、

 

 

;这段代码的功能:将BX中的16位数逐位按照十六进制逆时针旋转一圈(4位),并将结果打印出来 mov ch, 4 ; 设置循环计数器CH的初值为4,循环4次 rotate: mov cl, 4 ; 设置移位操作数CL的值为4 rol bx, cl ; 将BX左移4位,移到最高位到最低位,并将CF标志设置为所移出的最高位 mov al, bl ; 将BX的低8位复制到AL and al, 0fh ; 将AL的高四位清零,只保留低四位的值(先将16进制数的最高位数值抠出来) add al, 30h ; 将AL的值加上ASCII码‘0’(30h),将数字变成字符 cmp al, 3ah ; 判断AL是否大于ASCII码‘9’(39h),即是否是数字字符外的字符 jl printit ; 如果AL小于‘:’(3ah),即是数字字符,则跳转到printit标记 add al, 7h ; 如果AL大于等于‘:’,即是字母字符,将AL的值加上‘7’,转换成字母字符 printit: ; 输出结果标记 mov dl, al ; 将结果存储在DL中,好输出 mov ah, 2 ; 设置功能号为2,表示输出一个字符 int 21h ; 调用21h中断,输出字符 dec ch ; 循环计数器减1 jnz rotate ; 如果计数器不为0,继续循环

2、编一个 程序完成从键盘上输入一个 16 位以内 (回车结束) 的 二 进制数,并以 16 进制形式显示出来(大同小异)

.model small .stack 100h .data string db 17,?,17 dup(' ');输入16位以内 newline db 0ah,0dh,'$' N DW 0 .code start: mov ax,@data mov ds,ax qishi: lea dx,string mov ah,0ah int 21h lea dx,newline mov ah,09h int 21h lea si,string+1;输入的位数 mov cl,[si] mov ch,0 L: add si,1 mov al,[si] sub al,30h cmp al,0;保证输入的二进制是0或1 jl qishi cmp al,1 jg qishi mov bl,al ;al的值有两处存储。bl:当前输入的一位,N:过去输入的二进制 mov bh,0 mov ax,N ;AX! shl ax,1 add ax,bx mov N,ax LOOP L mov ax,N mov ch,4 ;每次4位,循环ch=4次 ;每4位转16进制 L2: mov cl,4 rol ax,cl ;最高位移动到最低位 push ax ;移动后保存,方便下一次 and al,0fh mov dl,al add dl,30h cmp dl,39h jle L3 add dl,07h L3: mov ah,02h int 21h pop ax dec ch ;下一个4位 cmp ch,0 jne L2 mov ah,4ch int 21h end start

 二进制转十进制

首先将二进制数补齐位数,首位如果是0就代表正整数,首位如果是1就代表负整数。 若首位是0的正整数,补齐位数以后,将二进制中的位数分别与对应的值相乘,然后相加得到的就为十进制。(从后往前数位数,从0开始数)

1、下面程序输入16位以内的二进制数(输入时回车作为输入结束),然后以有符号十进制数形式显示出来。将空格处指令补充完整,使得程序能完整实现所需要的功能。

CODE SEGMENT ORG 100H ASSUME CS:CODE,DS:CODE,ES:CODE,SS:CODE MAIN PROC NEAR CALL I2;输入二进制 CALL D10;输出十进制 MOV AH,4CH INT 21H MAIN ENDP I2 PROC NEAR PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI XOR BX,BX MOV CX,16;输入16位数 L20: MOV AH,1 INT 21H (CMP AL,0DH )……………①;回车 JE L21 CMP AL,30H;接收01 JB L20 CMP AL,31H JA L20 AND AX,01H;清除高八位 SHL BX,1 ADD BX,AX ( LOOP L20 )……………②;循环输入16个数 L21: MOV AX,BX;输入的二进制 POP DI POP SI POP DX POP CX POP BX RET I2 ENDP D10 PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI ( MOV BX,AX )……………③ MOV AH,9 LEA DX,CRLF INT 21H OR BX,BX;是否负数 JNS L100;非负数跳转 MOV AH,2 mov dl,2dh )……………④;输出负号 INT 21H NEG BX L100: MOV AX,BX XOR CX,CX MOV SI,10 L101: XOR DX,DX ( DIV SI )……………⑤;将AX除以10,商在AX中,余数在DX中 PUSH DX;将余数压栈 INC CX;将CX寄存器加1(记录位数) CMP AX,0;获取商的值 JNZ L101 L102: POP DX;将栈顶元素弹出到DX寄存器 MOV AH,2 ( ADD DL,30H )……………⑥;将数字转换成字符 INT 21H LOOP L102 POP DI POP SI POP DX POP CX POP BX POP AX ( RET )……………⑦ CRLF DB 0DH,0AH,24H D10 ENDP CODE ENDS END MAIN

十六进制转十进制

十六进制转换成十进制的公式是:要从右到左用二进制的每个数去乘以16的相应次方,然后这些数字相加就是了。

下面是一个.com文件格式的程序,完成从键盘上输入一个4位以内的16进制数,并以10进制形式显示出来。请在标号处填上缺少的指令(TEST1)

HEX2DEC SEGMENT ORG 100H ASSUME CS:HEX2DEC,SS:HEX2DEC,DS:HEX2DEC,ES:HEX2DEC MAIN PROC NEAR XOR BX,BX;清零,将存储转换后的十进制 MOV CH,4;循环次数(输入4位以内) L1: MOV AH,1;键盘输入并回显 _____(1)_______INT 21H CMP AL,0DH;是否为回车 JE DISP10 CMP AL,30H;是否9 JBE L2;0-9为合法数字 CMP AL,41H;是否字母 JB L1;非法字符,重新输入 CMP AL,46H JBE L2;A-F CMP AL,61H;是否小写字母 JB L1 CMP AL,66H JA L1 SUB AL,20H;小写字母转换为大写 L2: SUB AL,30H;转换为对应的十进制数字 CMP AL,9 JBE L3;0-9数字 SUB AL,7;10-15字母转换 L3: MOV CL,4;循环 SHL BX,CL;为下个位的处理腾出空间 XOR AH,AH;防止移位溢出 ADD BX,AX;转换后的10进制数存储 ____(3)_________ DEC CH;处理下个字符前,循环计数器CH-1 JNZ L1 DISP10: LEA DX,CRLF MOV AH,9;显示回车 INT 21H OR BX,BX;判断是否小于0 JNS L4;不小于0时 MOV DL,2DH;负数,将“-”存储 MOV AH,2 INT 21H NEG BX;取反,把负数变正数 ;;准备十进制数输出显示操作 L4: XOR CX,CX;记录10进制数位数,初始化为0 MOV AX,BX;10进制数存储 L5: XOR DX,DX;存储被除数的余数 ____(4)________ MOV SI,10 DIV SI;把AX数除以10,商放AL,余数在DX PUSH DX INC CX;每除1次,代表位数+1 OR AX,AX;若商为0,准备输出 JZ L6 JMP L5 L6: POP DX;后进先出(高位) ____(5)___________ADD DL,30H;转ASCII MOV AH,2 INT 21H LOOP L6 INT 20H;程序正常结束 CRLF DB 0DH,0AH,24H;回车换行符加字符串结束符号’$’ MAIN ENDP HEX2DEC ENDS END MAIN

十六进制转八进制

 编一个程序完成从键盘上输入一个4位的16进制数,并以八进制形式显示出来。

Data segment Strlen db 5 Actlen db ? String db 5 dup(?) Data ends Code segment assume ds:Data, cs:Code start: mov ax,Data mov ds,ax lea dx,strlen mov ah,10 int 21h ;输入16进制数 mov ah,2 mov dl,0dh int 21h mov dl,0ah int 21h ;输出回车换行 mov ch,0 mov cl,actlen lea si,string mov bx,0 l: push cx mov dl,[si] cmp dl,'a' jb next1 sub dl,20h ;小写变大写 next1: cmp dl,'A' jb next2 sub dl,7 ;为大写字母变为相应的数值做准备 next2: sub dl,30h ;变为所相对应的数值 mov dh,0 mov cl,4 shl bx,cl ;4个16进制数刚好可以存放到一个字,在这里存放到bx add bx,dx ;依次推入到bx中 inc si pop cx loop l mov ax,bx ;以8进制形式输出 mov bx,8 mov cx,0 ldiv: mov dx,0 div bx push dx inc cx cmp ax,0 jz toPrint jmp ldiv toPrint: pop dx add dl,30h mov ah,2 int 21h loop toPrint mov ah,4ch int 21h Code ends end start

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3