汇编端口
学到14章端口在某个芯片里面有个时间钟,它的信息被存放在那个71端口,我想把月的信息显示在屏幕上但是这是个cbd码,我看小甲鱼用 shl 指令将那个数左移四位,说取得这个数的十位,为什么这样做能取得它的十位,还有往显存里面写数据让它显示十进制数是不是在编程的时候放入的是它的ascall码 不知道这个代码够不够assume cs:code
stack segment
db 1024 dup(0)
stack ends
code segment
start:
mov ax, stack
mov ss, ax
mov sp, 1024
mov ax, 0b800h
mov es, ax
mov bx, 5 * 160
mov byte ptr es:, '2'
mov byte ptr es:, '0'
mov al, 9 ; 年
out 70h, al
in al, 71h
mov ah, al
mov cl, 4
shr al, cl
add al, 30h
mov byte ptr es:, al
mov al, ah
and al, 0fh
add al, 30h
mov byte ptr es:, al
mov byte ptr es:, '/'
mov al, 8 ; 月
out 70h, al
in al, 71h
mov ah, al
mov cl, 4
shr al, cl
add al, 30h
mov byte ptr es:, al
mov al, ah
and al, 0fh
add al, 30h
mov byte ptr es:, al
mov byte ptr es:, '/'
mov al, 7 ; 日
out 70h, al
in al, 71h
mov ah, al
mov cl, 4
shr al, cl
add al, 30h
mov byte ptr es:, al
mov al, ah
and al, 0fh
add al, 30h
mov byte ptr es:, al
mov byte ptr es:, ' '
mov al, 4 ; 时
out 70h, al
in al, 71h
mov ah, al
mov cl, 4
shr al, cl
add al, 30h
mov byte ptr es:, al
mov al, ah
and al, 0fh
add al, 30h
mov byte ptr es:, al
mov byte ptr es:, ':'
mov al, 2 ; 分
out 70h, al
in al, 71h
mov ah, al
mov cl, 4
shr al, cl
add al, 30h
mov byte ptr es:, al
mov al, ah
and al, 0fh
add al, 30h
mov byte ptr es:, al
mov byte ptr es:, ':'
mov al, 0 ; 秒
out 70h, al
in al, 71h
mov ah, al
mov cl, 4
shr al, cl
add al, 30h
mov byte ptr es:, al
mov al, ah
and al, 0fh
add al, 30h
mov byte ptr es:, al
mov ax, 4c00h
int 21h
code ends
end start 本帖最后由 jackz007 于 2019-5-20 01:13 编辑
1、关于左移 4 位的作用:
左移 1 位就是 x 2,左移 2 位就是 x 4,左移 4 位就是 x 16。假如一个字节的值是 09,那么,左移 4 位就会变成 90,个位上的数值就被平移到十位数上了。
2、往显存里面写数据让它显示十进制数是不是在编程的时候放入的是它的ascall码?
准确地说,被放入的是字符串形式的十进制数值。
关于十进制数的显示,请参考以下代码:
data segment para public
db 020h dup(00)
data ends
stack segment stack
dw 080h dup(00)
stack ends
code segment para public
assume cs:code , ds:data , ss:stack
bin2hex proc near
push bx
push cx
push dx
push ds
push es
mov si,0fh
push ax
pop bx
mov cl,04h
h1: mov al,bl
and al,0fh
shr bx,cl
cmp al,0ah
jb h2
add al,37h
jmp h3
h2: add al,030h
h3: mov ,al
or bx,bx
jz h4
dec si
jmp h1
h4: mov cx,0fh
sub cx,si
inc cx
push ds
pop es
xor di,di
rep movsb
xor al,al
stosb
pop es
pop ds
pop dx
pop cx
pop bx
ret
bin2hex endp
bin2dec proc near
push bx
push cx
push dx
push ds
push es
mov si,1fh
b1: xor dx,dx
mov cx,0ah
div cx
add dl,30h
mov ,dl
or ax,ax
jz b2
dec si
jmp b1
b2: mov cx,1fh
sub cx,si
inc cx
push ds
pop es
mov di,010h
rep movsb
xor al,al
stosb
pop es
pop ds
pop dx
pop cx
pop bx
ret
bin2dec endp
show proc near
push bx
push cx
push dx
push si
push di
push ds
push es
push ax
mov al,ah
xor ah,ah
mov cl,0a0h
mul cl
push ax
pop di
pop ax
xor ah,ah
add al,al
add di,ax
push di
xor si,si
mov ax,0b800h
mov es,ax
s1: lodsb
or al,al
jz s2
stosb
mov al,2
stosb
jmp s1
s2: pop di
add di,0a0h
mov si,010h
s3: lodsb
or al,al
jz s4
stosb
mov al,02
stosb
jmp s3
s4: pop es
pop ds
pop di
pop si
pop dx
pop cx
pop bx
ret
show endp
cls proc near
push ax
push bx
push cx
push dx
mov ax,0600h
xor cx,cx
mov dx,0184fh
int 10h
pop dx
pop cx
pop bx
pop ax
ret
cls endp
ppause proc near
push ax
xor ax,ax
int 016h
pop ax
ret
ppause endp
main proc far ; 程序入口
mov ax,data
push ax
pop ds
push ax
pop es
mov ax,1234h ; 屏幕显示 ax 的数值
push ax
call bin2dec ; 把数值转化为十进制字符串
pop ax
call bin2hex ; 把数值转化为十六进制字符串
call cls ; 清屏
mov ax,0b28h ; 在第11行,40列显示结果
call show ; 在屏幕的指定位置显示字符串
call ppause ; 等待键盘输入
mov ax,4c00h
int 21h
main endp
code ends
end main 比如19这个这个数左移4位变成91它原本的十位不是1么我们应该取那个1的值位10位啊,而不是那个9这么移那个数不就变了 一楼那个代码我很好奇你为什么要设个栈,你的代码全程都没用到,用来看的么 小白100000000 发表于 2019-5-20 09:21
一楼那个代码我很好奇你为什么要设个栈,你的代码全程都没用到,用来看的么
用到了,这个等你学到后面就明白了
现在给一点提示,中断会使用栈保存一些必要的数据
小白100000000 发表于 2019-5-20 09:21
一楼那个代码我很好奇你为什么要设个栈,你的代码全程都没用到,用来看的么
mov al, 9 ; 年
out 70h, al
in al, 71h
执行完in al, 71h后al中的内容是0x19,因为今年是2019年
al中的高4位是1,低4位是9
把al中的内容右移4位后al中的内容变成了0x01,最右边的9移没了,不过不用担心,ah中有备份
字符'1' 和 数字1不一样
1 + 0x30 = '1'
所以要add al, 30h
mov al, 9 ; 年
out 70h, al
in al, 71h
mov ah, al
mov cl, 4
shr al, cl
add al, 30h
mov byte ptr es:, al
mov al, ah
and al, 0fh
add al, 30h
mov byte ptr es:, al
mov byte ptr es:, '/'
页:
[1]