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
以上就是关于汇编十进制数制转换二进制和十六进制全部的内容,包括:汇编十进制数制转换二进制和十六进制、汇编语言 显示程序怎么做出来呢,举个例子来、汇编中用汇编语言编写的数据定义语句的写法,最好有实例等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)