鱼C论坛

 找回密码
 立即注册
查看: 1968|回复: 8

十三章实验题 求大牛指点一下,代码中还需要修改那些地方?

[复制链接]
发表于 2012-12-22 15:12:47 | 显示全部楼层 |阅读模式
3鱼币
本帖最后由 lyoal 于 2012-12-22 15:47 编辑

十三章实验题 求大牛指点一下,代码中还需要修改那些地方?
不知道是不是寄存器冲突导致的
assume cs:code
data segment
 db 'Welcom to masm!',0
data endscode segment
start: 
;========================安装中断例程=============================================
  mov ax,cs    ;定义中断例程数据源
  mov ds,ax
  mov si,offset sst
  
  mov ax,0    ;定义中断例程安装的目的地址
  mov es,ax
  mov di,200h
  
  mov cx,offset ssend - offset sst ;定义中断例程的长度
  cld      ;定义数据传送方向
  rep movsb    ;传送字符
  
  mov ax,0
  mov es,ax    ;设置中断向量
  mov word ptr es:[7ch*4],200h
  mov word ptr es:[7ch*4+2],0
  
  mov ax,4c00h
  int 21h
;===========================主程序=========================================
  mov dh,10   ;行
  mov dl,10   ;列
  mov cl,2   ;颜色
  mov ax,data
  mov ds,ax   ;将字符串数据段关联到DS
  mov si,0   ;设置SI为字符串首地址
  int 7ch
  
  mov ax,4c00h
  int 21h;======================被安装的中断例程=========================================  
  
sst: mov ax,0b800h  ;关联显示缓冲区
  mov es,ax
  mov di,9*160+10*2 ;设置字符串在显示缓冲区的首地址
  
s:  cmp byte ptr [si],0
  je short ok
  mov ch,byte ptr [si]
  mov byte ptr es:[di], ch
  mov byte ptr es:[di+1],cl
  inc si
  add di,2
  jmp short s
  
ok:  iret
  
ssend: nop
    code ends
end start
 

最佳答案

查看完整内容

兄弟,你进步神速啊,自己解决了,你分给谁啊,可是给不了自己的哦,上次在我求助帖里我可是帮你解决一些问题了哦,这里的分是不是应该给我啊:(
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-12-22 15:12:48 | 显示全部楼层
兄弟,你进步神速啊,自己解决了,你分给谁啊,可是给不了自己的哦,上次在我求助帖里我可是帮你解决一些问题了哦,这里的分是不是应该给我啊:(
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-22 15:45:04 | 显示全部楼层
本帖最后由 lyoal 于 2012-12-22 15:46 编辑
assume cs:code
data segment
 db 'Welcom to masm!',0
data endscode segment
start: 
;========================安装中断例程=============================================
  mov ax,cs    ;定义中断例程数据源
  mov ds,ax
  mov si,offset sst
  
  mov ax,0    ;定义中断例程安装的目的地址
  mov es,ax
  mov di,200h
  
  mov cx,offset ssend - offset sst ;定义中断例程的长度
  cld      ;定义数据传送方向
  rep movsb    ;传送字符
  
  mov ax,0
  mov es,ax    ;设置中断向量
  mov word ptr es:[7ch*4],200h
  mov word ptr es:[7ch*4+2],0
    ;mov ax,4c00h
  ;int 21h
;===========================主程序=========================================
  mov dh,10   ;行
  mov dl,10   ;列
  mov cl,2   ;颜色
  mov ax,data
  mov ds,ax   ;将字符串数据段关联到DS
  mov si,0   ;设置SI为字符串首地址
  int 7ch
  
  mov ax,4c00h
  int 21h;======================被安装的中断例程===============================================  
  
sst: mov ax,0b800h  ;关联显示缓冲区
  mov es,ax
  mov di,9*160+10*2 ;设置字符串在显示缓冲区的首地址
  
s:  cmp byte ptr [si],0
  je short ok
  mov ch,byte ptr [si]
  mov byte ptr es:[di], ch
  mov byte ptr es:[di+1],cl
  inc si
  add di,2
  jmp short s
  
ok:  iret
  
ssend: nop
    code ends
end start 
自己解决了,谢谢自己一下,哈哈。。。。。

评分

参与人数 1鱼币 +5 收起 理由
小甲鱼 + 5

查看全部评分

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

使用道具 举报

发表于 2012-12-22 18:10:02 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-22 20:35:10 | 显示全部楼层
小甲鱼 发表于 2012-12-22 18:10
这么快自食其力啦~

:lol回头调示了一下,一不小心成了。谋事在人,成事在天啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-22 20:36:35 | 显示全部楼层
本帖最后由 lyoal 于 2012-12-22 20:39 编辑
wawa 发表于 2012-12-22 15:12
兄弟,你进步神速啊,自己解决了,你分给谁啊,可是给不了自己的哦,上次在我求助帖里我可是帮你解决一些问 ...
Assume cs:code
data segment
        db '9,8,7,4,2,0',0
data ends

code segment
start:
        
        mov ax,data
        mov ds,ax
        mov si,0

        mov ax,0b800h
        mov es,ax
        mov di,160*12+36*2
        mov bl,2
        mov cx,6
        sub ax,ax
s:        push cx
        mov al,[si]
        add al,30h
        out 70h,al                ;对CMOS RAM端口进行读写操作
        in al,71h
        mov ah,al
        mov cl,4
        shr ah,cl
        and al,00001111b
        
        add ah,30h                ;将数字转换成字符
        add al,30h
        
        mov byte ptr es:[di],ah
        mov byte ptr es:[di+1],bl
        mov byte ptr es:[di+2],al
        mov byte ptr es:[di+3],bl
        inc si
        add di,4
        
        pop cx
        loop s
        
ok:        mov ax,4c00h
        int 21h
        
        code ends
end start
给你,不能白给,帮忙指点一下这个问题,呵呵。。。。
这段代码,我想实现,循环读取CMOS RAM中的年月日时分秒。整了两小时了,没搞出来,帮忙指点一下撒。
鱼C老师能光顾咱的贴子,三生有幸啊,呵呵。。。。。您老如有时间望也能不吝指点一下迷津。
感谢各位大牛!THKS V M!

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

使用道具 举报

发表于 2012-12-22 21:38:59 | 显示全部楼层
{:1_1:}20~23行代码有误,数据段定义有误,你想把cmos地址放在数据段中应该表示为db 9,8,7,4,2,0,干嘛要用字符串,数值加30h变字符 你的第21行代码,应该是减30h吧,你想把字符变数值吧,你字符串里还有逗号,20行 在第二次循环里,你把逗号传给al 然后out 70h,al 肯定出错啊,正确答案我想你有吧 我就不发了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-22 21:48:15 | 显示全部楼层
wawa 发表于 2012-12-22 21:38
20~23行代码有误,数据段定义有误,你想把cmos地址放在数据段中应该表示为db 9,8,7,4,2,0,干嘛要用 ...
Assume cs:code
data segment
        db '987420'
data ends

code segment
start:
        
        mov ax,data
        mov ds,ax
        mov si,0

        mov ax,0b800h
        mov es,ax
        mov di,160*12+36*2
        mov bl,2
        mov cx,6
        sub ax,ax
s:        push cx
        mov al,[si]
        sub al,30h
        out 70h,al                ;对CMOS RAM端口进行读写操作
        in al,71h
        mov ah,al
        mov cl,4
        shr ah,cl
        and al,00001111b
        
        add ah,30h                ;将数字转换成字符
        add al,30h
        
        mov byte ptr es:[di],ah
        mov byte ptr es:[di+1],bl
        mov byte ptr es:[di+2],al
        mov byte ptr es:[di+3],bl
        inc si
        add di,4
        
        pop cx
        loop s
        
ok:        mov ax,4c00h
        int 21h
        
        code ends
end start
        
非常感谢兄弟的指点,确实是要减30h,我之前减过一次,没成功,可能就出在数据段定义中的豆号的原因。GODD,THKS.
贴出来跟大家分享一下下。呵呵
大牛勿喷
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-4-24 21:14:54 | 显示全部楼层
来看看呵呵
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 16:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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