鱼C论坛

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

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

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

十三章实验题 求大牛指点一下,代码中还需要修改那些地方?
不知道是不是寄存器冲突导致的
  1. assume cs:code
  2. data segment
  3. db 'Welcom to masm!',0
  4. data endscode segment
  5. start:
  6. ;========================安装中断例程=============================================
  7.   mov ax,cs    ;定义中断例程数据源
  8.   mov ds,ax
  9.   mov si,offset sst
  10.   
  11.   mov ax,0    ;定义中断例程安装的目的地址
  12.   mov es,ax
  13.   mov di,200h
  14.   
  15.   mov cx,offset ssend - offset sst ;定义中断例程的长度
  16.   cld      ;定义数据传送方向
  17.   rep movsb    ;传送字符
  18.   
  19.   mov ax,0
  20.   mov es,ax    ;设置中断向量
  21.   mov word ptr es:[7ch*4],200h
  22.   mov word ptr es:[7ch*4+2],0
  23.   
  24.   mov ax,4c00h
  25.   int 21h
  26. ;===========================主程序=========================================
  27.   mov dh,10   ;行
  28.   mov dl,10   ;列
  29.   mov cl,2   ;颜色
  30.   mov ax,data
  31.   mov ds,ax   ;将字符串数据段关联到DS
  32.   mov si,0   ;设置SI为字符串首地址
  33.   int 7ch
  34.   
  35.   mov ax,4c00h
  36.   int 21h;======================被安装的中断例程=========================================  
  37.   
  38. sst: mov ax,0b800h  ;关联显示缓冲区
  39.   mov es,ax
  40.   mov di,9*160+10*2 ;设置字符串在显示缓冲区的首地址
  41.   
  42. s:  cmp byte ptr [si],0
  43.   je short ok
  44.   mov ch,byte ptr [si]
  45.   mov byte ptr es:[di], ch
  46.   mov byte ptr es:[di+1],cl
  47.   inc si
  48.   add di,2
  49.   jmp short s
  50.   
  51. ok:  iret
  52.   
  53. ssend: nop
  54.     code ends
  55. end start
复制代码

最佳答案

查看完整内容

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

使用道具 举报

 楼主| 发表于 2012-12-22 15:45:04 | 显示全部楼层
本帖最后由 lyoal 于 2012-12-22 15:46 编辑
  1. assume cs:code
  2. data segment
  3. db 'Welcom to masm!',0
  4. data endscode segment
  5. start:
  6. ;========================安装中断例程=============================================
  7.   mov ax,cs    ;定义中断例程数据源
  8.   mov ds,ax
  9.   mov si,offset sst
  10.   
  11.   mov ax,0    ;定义中断例程安装的目的地址
  12.   mov es,ax
  13.   mov di,200h
  14.   
  15.   mov cx,offset ssend - offset sst ;定义中断例程的长度
  16.   cld      ;定义数据传送方向
  17.   rep movsb    ;传送字符
  18.   
  19.   mov ax,0
  20.   mov es,ax    ;设置中断向量
  21.   mov word ptr es:[7ch*4],200h
  22.   mov word ptr es:[7ch*4+2],0
  23.     ;mov ax,4c00h
  24.   ;int 21h
  25. ;===========================主程序=========================================
  26.   mov dh,10   ;行
  27.   mov dl,10   ;列
  28.   mov cl,2   ;颜色
  29.   mov ax,data
  30.   mov ds,ax   ;将字符串数据段关联到DS
  31.   mov si,0   ;设置SI为字符串首地址
  32.   int 7ch
  33.   
  34.   mov ax,4c00h
  35.   int 21h;======================被安装的中断例程===============================================  
  36.   
  37. sst: mov ax,0b800h  ;关联显示缓冲区
  38.   mov es,ax
  39.   mov di,9*160+10*2 ;设置字符串在显示缓冲区的首地址
  40.   
  41. s:  cmp byte ptr [si],0
  42.   je short ok
  43.   mov ch,byte ptr [si]
  44.   mov byte ptr es:[di], ch
  45.   mov byte ptr es:[di+1],cl
  46.   inc si
  47.   add di,2
  48.   jmp short s
  49.   
  50. ok:  iret
  51.   
  52. ssend: nop
  53.     code ends
  54. end start
复制代码
自己解决了,谢谢自己一下,哈哈。。。。。

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-22 18:10:02 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

:lol回头调示了一下,一不小心成了。谋事在人,成事在天啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

  5. code segment
  6. start:
  7.         
  8.         mov ax,data
  9.         mov ds,ax
  10.         mov si,0

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

小甲鱼最新课程 -> https://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 肯定出错啊,正确答案我想你有吧 我就不发了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

  5. code segment
  6. start:
  7.        
  8.         mov ax,data
  9.         mov ds,ax
  10.         mov si,0

  11.         mov ax,0b800h
  12.         mov es,ax
  13.         mov di,160*12+36*2
  14.         mov bl,2
  15.         mov cx,6
  16.         sub ax,ax
  17. s:        push cx
  18.         mov al,[si]
  19.         sub al,30h
  20.         out 70h,al                ;对CMOS RAM端口进行读写操作
  21.         in al,71h
  22.         mov ah,al
  23.         mov cl,4
  24.         shr ah,cl
  25.         and al,00001111b
  26.        
  27.         add ah,30h                ;将数字转换成字符
  28.         add al,30h
  29.        
  30.         mov byte ptr es:[di],ah
  31.         mov byte ptr es:[di+1],bl
  32.         mov byte ptr es:[di+2],al
  33.         mov byte ptr es:[di+3],bl
  34.         inc si
  35.         add di,4
  36.        
  37.         pop cx
  38.         loop s
  39.        
  40. ok:        mov ax,4c00h
  41.         int 21h
  42.        
  43.         code ends
  44. end start
  45.        
复制代码
非常感谢兄弟的指点,确实是要减30h,我之前减过一次,没成功,可能就出在数据段定义中的豆号的原因。GODD,THKS.
贴出来跟大家分享一下下。呵呵
大牛勿喷
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-4-24 21:14:54 | 显示全部楼层
来看看呵呵
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-3 17:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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