汇编十进制数制转换二进制和十六进制

汇编十进制数制转换二进制和十六进制,第1张

assume cs:code, ds:data

data segment

num dw 0

ten dw 10

tmp dw 0

buffer db 256 dup()

data ends

code segment

start: mov ax, data

mov ds, ax

call input ; 输入

call crlf ; 输出一个换行

lea bx, buffer ; bx为存储地址

mov ax, num

call d2b ; 10进制到2进制转换

mov ah, 9 ; 输出

mov dx, bx

int 21h

call crlf ; 输出一个换行

mov ax, num

call d2h ; 10进制到16进制转换

mov ah, 9

mov dx, bx

int 21h

mov ax, 4c00h

int 21h

input: finit ; 输入过程,结果保存在num里

fldz

_1L1: mov ah, 1

int 21h

cmp al, 13

jz done1

xor ah, ah

sub al, '0'

mov tmp, ax

fimul ten

fiadd tmp

jmp _1L1

done1: fistp num

ret

d2b: xor si, si ; 10进制到2进制转换

xor di, di

mov dx, 8000h

jmp _2L2

_upd1: inc si

_2L1: shr dx, 1

jz done2

_2L2: test dx, ax

jnz _2ones

cmp di, 0

jz _2L1

mov byte ptr [bx+si], '0'

jmp _upd1

_2ones: mov byte ptr [bx+si], '1'

mov di, 1

jmp _upd1

done2: cmp si, 0

jg _2L4

mov byte ptr [bx+si], '0'

inc si

_2L4: mov byte ptr [bx+si], 'B'

mov byte ptr [bx+si+1], '$'

ret

d2h: mov cl, 4 ; 10进制到16进制转换

xor si, si

xor di, di

jmp _3L3

_3L1: inc si

_3L2: shl ax, cl

jz done3

_3L3: mov dx, ax

and dx, 0f000h

rol dx, cl

cmp di, 0

jnz _3L4

cmp dx, 0

jz _3L2

mov di, 1

_3L4:

cmp dx, 10

jge _3acs

add dl, '0'

mov [bx+si], dl

jmp _3L1

_3acs: sub dx, 10

add dx, 'A'

mov [bx+si], dl

jmp _3L1

done3: cmp si, 0

jg _3L5

mov byte ptr [bx+si], '0'

inc si

_3L5:

mov byte ptr [bx+si], 'H'

mov byte ptr [bx+si+1], '$'

ret

crlf: mov ah, 2 ; 输出一个回车

mov dl, 13

int 21h

mov dl, 10

int 21h

ret

code ends

end start

显示的肯定是ASC码了。。每个字符都对应着一个ASC码,显示的原理就是输出字符所代表的ASC码。。。往内存中B8000-BFFFF写入数据,就相当于屏幕中显示。总共32KB,分为8页,每页4KB,相当于四千字节,每个字用一个ASC码和字体属性组成。。就是2000个字,一共25行,每行80个字,160个字节。。

给你举个例子吧

mov ax,b800h

mov ds,ax

mov si,0

s: mov [si],31h

add si,2

loop s

就相当于在第一页第一行写入字符1,但是并没有设置字符属性。。

写这么简单,是为了让你理解。。

定义一个字符串

var1 db 'hello,world$'

定义一个未初始化和已初始化的字符

var2 db

var3 db 'H'

定义一个2字节(DWORD)的变量

var4 dw

定义一个4字节的变量

var5 dd

定义一个含有40个数据,类似于数组的变量

var6 db 40 dup() ; 可以用一个值代替‘’初始化

端口是主机与外设进行数据交换的。(外设接口电路有专用于数据交互的寄存器。为了与CPU中的寄存器相区别,称之为“端口”)。端口有数据端口,状态端口和控制端口3种。

PC机给予每一个端口分配了一个地址(称为端口号),形成一个独立于内存空间的I/O地址空间。在8086/8088中,端口地址的范围是0000至FFFF。

CPU对外设的 *** 作通过专门的端口读写指令来完成。读端口用IN指令,写端口用OUT指令。

——————————————————————————————————————————

IN ACC,PORT;从端口PORT读取数据到ACC;

PORT可以是立即数,也可以是DX。

ACC为AL时,从PORT读取1字节数据到AL

ACC为AX时,从PORT读取2字节数据到AX

——————————

OUT PORT,ACC;将ACC的数据写入端口PORT;

——————————

例子:

IN AL,21H;表示从21H端口读取一字节数据到AL

IN AX,21H;表示从端口地址21H读取1字节数据到AL,从端口地址22H读取1字节到AH

MOV DX,379H

IN AL,DX ;从端口379H读取1字节到AL

—————

OUT 21H,AL;将AL的值写入21H端口

OUT 21H,AX;将AX的值写入端口地址21H开始的连续两个字节。(port[21H]=AL,port[22h]=AH)

MOV DX,378H

OUT DX,AX ;将AH和AL分别写入端口379H和378H

以下是从键盘输入一个一位数的程序,赋值给CX,输入等于0则什么都不做,不等于0则输出“cx != 0”,经调试通过

DATA SEGMENT

IN_A DB 'INPUT: CX =','$'

OUT_A DB 'OUTPUT: CX != 0','$'

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE, DS:DATA

MAIN PROC FAR

MOV AX, DATA

MOV DS, AX

MOV AH, 9 ;输出"CX ="

LEA DX, IN_A

INT 21H

MOV AH, 0 ;从键盘输入一个数字赋值给CX

INT 16H

XOR AH, AH ;清零AH

MOV CX, AX

SUB CX, 30H ;需要将从键盘接受的字符的ASCII码转为数字(ASCII码=数字+30H)

MOV AH, 2 ;设置光标位置1行0列

MOV BH, 0

MOV DH, 1

MOV DL, 0

INT 10H

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

CMP CX, 0 ;比较CX和0的大小

JE EXIT ;相等则跳转到EXIT

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

MOV AH, 9 ;CX不等于0才会执行该语句,输出CX != 0

LEA DX, OUT_A

INT 21H

EXIT: ;CX=0程序什么都不做直接退出

MOV AX, 4C00H

INT 21H

MAIN ENDP

CODE ENDS

END MAIN

以上就是关于汇编十进制数制转换二进制和十六进制全部的内容,包括:汇编十进制数制转换二进制和十六进制、汇编语言 显示程序怎么做出来呢,举个例子来、汇编中用汇编语言编写的数据定义语句的写法,最好有实例等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9476149.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存