鱼C论坛

 找回密码
 立即注册
查看: 3092|回复: 6

汇编端口

[复制链接]
发表于 2019-5-19 23:57:41 From FishC Mobile | 显示全部楼层 |阅读模式
100鱼币
学到14章端口在某个芯片里面有个时间钟,它的信息被存放在那个71端口,我想把月的信息显示在屏幕上但是这是个cbd码,我看小甲鱼用 shl 指令将那个数左移四位,说取得这个数的十位,为什么这样做能取得它的十位,还有往显存里面写数据让它显示十进制数是不是在编程的时候放入的是它的ascall码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-5-20 00:47:17 | 显示全部楼层
不知道这个代码够不够

  1. assume cs:code

  2. stack segment
  3.         db        1024 dup(0)
  4. stack ends

  5. code segment
  6. start:
  7.         mov        ax, stack
  8.         mov        ss, ax
  9.         mov        sp, 1024
  10.        
  11.         mov        ax, 0b800h
  12.         mov        es, ax
  13.         mov        bx, 5 * 160
  14.        
  15.         mov        byte ptr es:[bx + 0], '2'
  16.         mov        byte ptr es:[bx + 2], '0'
  17.        
  18.         mov        al, 9                ; 年
  19.         out        70h, al
  20.         in        al, 71h
  21.         mov        ah, al
  22.         mov        cl, 4
  23.         shr        al, cl
  24.         add        al, 30h
  25.         mov        byte ptr es:[bx + 4], al
  26.         mov        al, ah
  27.         and        al, 0fh
  28.         add        al, 30h
  29.         mov        byte ptr es:[bx + 6], al
  30.         mov        byte ptr es:[bx + 8], '/'
  31.        
  32.         mov        al, 8                ; 月
  33.         out        70h, al
  34.         in        al, 71h
  35.         mov        ah, al
  36.         mov        cl, 4
  37.         shr        al, cl
  38.         add        al, 30h
  39.         mov        byte ptr es:[bx + 10], al
  40.         mov        al, ah
  41.         and        al, 0fh
  42.         add        al, 30h
  43.         mov        byte ptr es:[bx + 12], al
  44.         mov        byte ptr es:[bx + 14], '/'
  45.        
  46.         mov        al, 7                ; 日
  47.         out        70h, al
  48.         in        al, 71h
  49.         mov        ah, al
  50.         mov        cl, 4
  51.         shr        al, cl
  52.         add        al, 30h
  53.         mov        byte ptr es:[bx + 16], al
  54.         mov        al, ah
  55.         and        al, 0fh
  56.         add        al, 30h
  57.         mov        byte ptr es:[bx + 18], al
  58.         mov        byte ptr es:[bx + 20], ' '
  59.        
  60.         mov        al, 4                ; 时
  61.         out        70h, al
  62.         in        al, 71h
  63.         mov        ah, al
  64.         mov        cl, 4
  65.         shr        al, cl
  66.         add        al, 30h
  67.         mov        byte ptr es:[bx + 22], al
  68.         mov        al, ah
  69.         and        al, 0fh
  70.         add        al, 30h
  71.         mov        byte ptr es:[bx + 24], al
  72.         mov        byte ptr es:[bx + 26], ':'
  73.        
  74.         mov        al, 2                ; 分
  75.         out        70h, al
  76.         in        al, 71h
  77.         mov        ah, al
  78.         mov        cl, 4
  79.         shr        al, cl
  80.         add        al, 30h
  81.         mov        byte ptr es:[bx + 28], al
  82.         mov        al, ah
  83.         and        al, 0fh
  84.         add        al, 30h
  85.         mov        byte ptr es:[bx + 30], al
  86.         mov        byte ptr es:[bx + 32], ':'
  87.        
  88.         mov        al, 0                ; 秒
  89.         out        70h, al
  90.         in        al, 71h
  91.         mov        ah, al
  92.         mov        cl, 4
  93.         shr        al, cl
  94.         add        al, 30h
  95.         mov        byte ptr es:[bx + 34], al
  96.         mov        al, ah
  97.         and        al, 0fh
  98.         add        al, 30h
  99.         mov        byte ptr es:[bx + 36], al
  100.        
  101.         mov        ax, 4c00h
  102.         int        21h
  103. code ends
  104. end start
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-5-20 01:12:03 | 显示全部楼层
本帖最后由 jackz007 于 2019-5-20 01:13 编辑

    1、关于左移 4 位的作用:
        左移 1 位就是 x 2,左移 2 位就是 x 4,左移 4 位就是 x 16。假如一个字节的值是 09,那么,左移 4 位就会变成 90,个位上的数值就被平移到十位数上了。

    2、往显存里面写数据让它显示十进制数是不是在编程的时候放入的是它的ascall码?
        准确地说,被放入的是字符串形式的十进制数值。
        关于十进制数的显示,请参考以下代码:
  1. data segment para public
  2.      db 020h dup(00)
  3. data ends
  4. stack segment stack
  5.      dw 080h dup(00)
  6. stack ends
  7. code segment para public
  8.     assume cs:code , ds:data , ss:stack
  9.     bin2hex proc near
  10.             push bx
  11.             push cx
  12.             push dx
  13.             push ds
  14.             push es
  15.             mov si,0fh
  16.             push ax
  17.             pop bx
  18.             mov cl,04h
  19.         h1: mov al,bl
  20.             and al,0fh
  21.             shr bx,cl
  22.             cmp al,0ah
  23.             jb h2
  24.             add al,37h
  25.             jmp h3
  26.         h2: add al,030h
  27.         h3: mov [si],al
  28.             or bx,bx
  29.             jz h4
  30.             dec si
  31.             jmp h1
  32.         h4: mov cx,0fh
  33.             sub cx,si
  34.             inc cx
  35.             push ds
  36.             pop es
  37.             xor di,di
  38.             rep movsb   
  39.             xor al,al
  40.             stosb
  41.             pop es
  42.             pop ds
  43.             pop dx
  44.             pop cx
  45.             pop bx
  46.             ret
  47.     bin2hex endp
  48.     bin2dec proc near
  49.             push bx
  50.             push cx
  51.             push dx
  52.             push ds
  53.             push es
  54.             mov si,1fh
  55.         b1: xor dx,dx
  56.             mov cx,0ah
  57.             div cx
  58.             add dl,30h
  59.             mov [si],dl
  60.             or ax,ax
  61.             jz b2
  62.             dec si
  63.             jmp b1
  64.         b2: mov cx,1fh
  65.             sub cx,si
  66.             inc cx
  67.             push ds
  68.             pop es
  69.             mov di,010h
  70.             rep movsb   
  71.             xor al,al
  72.             stosb
  73.             pop es
  74.             pop ds
  75.             pop dx
  76.             pop cx
  77.             pop bx
  78.             ret
  79.     bin2dec endp
  80.     show proc near
  81.             push bx
  82.             push cx
  83.             push dx
  84.             push si
  85.             push di
  86.             push ds
  87.             push es
  88.             push ax
  89.             mov al,ah
  90.             xor ah,ah
  91.             mov cl,0a0h
  92.             mul cl
  93.             push ax
  94.             pop di
  95.             pop ax
  96.             xor ah,ah
  97.             add al,al
  98.             add di,ax
  99.             push di
  100.             xor si,si
  101.             mov ax,0b800h
  102.             mov es,ax
  103.         s1: lodsb
  104.             or al,al
  105.             jz s2
  106.             stosb
  107.             mov al,2
  108.             stosb
  109.             jmp s1
  110.         s2: pop di
  111.             add di,0a0h
  112.             mov si,010h
  113.         s3: lodsb
  114.             or al,al
  115.             jz s4
  116.             stosb
  117.             mov al,02
  118.             stosb
  119.             jmp s3
  120.         s4: pop es
  121.             pop ds
  122.             pop di
  123.             pop si
  124.             pop dx
  125.             pop cx
  126.             pop bx
  127.             ret
  128.     show endp
  129.     cls proc near
  130.             push ax
  131.             push bx
  132.             push cx
  133.             push dx
  134.             mov ax,0600h
  135.             xor cx,cx
  136.             mov dx,0184fh
  137.             int 10h
  138.             pop dx
  139.             pop cx
  140.             pop bx
  141.             pop ax
  142.             ret
  143.     cls endp
  144.     ppause proc near
  145.             push ax
  146.             xor ax,ax
  147.             int 016h
  148.             pop ax
  149.             ret
  150.     ppause endp
  151.     main proc far                  ; 程序入口
  152.             mov ax,data
  153.             push ax
  154.             pop ds
  155.             push ax
  156.             pop es

  157.             mov ax,1234h           ; 屏幕显示 ax 的数值
  158.             push ax
  159.             call bin2dec           ; 把数值转化为十进制字符串
  160.             pop ax
  161.             call bin2hex           ; 把数值转化为十六进制字符串

  162.             call cls               ; 清屏

  163.             mov ax,0b28h           ; 在第11行,40列显示结果
  164.             call show              ; 在屏幕的指定位置显示字符串

  165.             call ppause            ; 等待键盘输入

  166.             mov ax,4c00h
  167.             int 21h
  168.     main endp
  169. code ends
  170. end main
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-5-20 09:16:47 From FishC Mobile | 显示全部楼层
比如19这个这个数左移4位变成91它原本的十位不是1么我们应该取那个1的值位10位啊,而不是那个9这么移那个数不就变了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-5-20 09:21:00 From FishC Mobile | 显示全部楼层
一楼那个代码我很好奇你为什么要设个栈,你的代码全程都没用到,用来看的么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-5-20 12:26:34 | 显示全部楼层
小白100000000 发表于 2019-5-20 09:21
一楼那个代码我很好奇你为什么要设个栈,你的代码全程都没用到,用来看的么

用到了,这个等你学到后面就明白了
现在给一点提示,中断会使用栈保存一些必要的数据
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-5-20 12:37:14 | 显示全部楼层
小白100000000 发表于 2019-5-20 09:21
一楼那个代码我很好奇你为什么要设个栈,你的代码全程都没用到,用来看的么
  1.         mov        al, 9                ; 年
  2.         out        70h, al
  3.         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


  1. mov        al, 9                ; 年
  2.         out        70h, al
  3.         in        al, 71h
  4.         mov        ah, al
  5.         mov        cl, 4
  6.         shr        al, cl
  7.         add        al, 30h
  8.         mov        byte ptr es:[bx + 4], al
  9.         mov        al, ah
  10.         and        al, 0fh
  11.         add        al, 30h
  12.         mov        byte ptr es:[bx + 6], al
  13.         mov        byte ptr es:[bx + 8], '/'
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 23:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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