鱼C论坛

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

[已解决]实验九

[复制链接]
发表于 2022-6-29 17:39:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1.png
这是调试的样子呜呜
而且,显示字符串以后dosbox就会卡住,没法再输入指令
代码如下:
  1. assume cs: codesg, ds: data, ss: stack

  2. data segment
  3.     db 'welcome to masm!' ; 在显存显示的字符串(16个字符,需要占32个字节,一个字节存放asc码,一个字节存放字符属性)
  4.     db 02h, 24h, 71h ; 定义三种颜色属性(黑底绿字, 绿底红字, 白底蓝字)
  5. data ends

  6. stack segment
  7.     dw 8 dup(0) ; 定义8个字型数据用于存放寄存器的值
  8. stack ends

  9. codesg segment
  10. start:
  11.     mov ax, data
  12.     mov ds, ax
  13.     mov ax, stack
  14.     mov ss, ax
  15.     mov sp, 10h ; 设置栈顶,八个字型数据占16个字节,故偏移地址取10h

  16.     xor bx, bx ; bx清零, 用来索引属性
  17.     mov ax, 0b872h ; 定位第十二行中间位置(作段地址使用): (11 * 160 + (80 - 16) / 2 * 2)在转换为16进制

  18.     mov cx, 3 ; 执行三次循环,打印三行语句
  19. s3:
  20.     push cx ; 为外循环保存相关寄存器的值
  21.     push ax ; 防止段地址的值在内循环中被改变
  22.     push bx

  23.     mov es, ax ; 此时es为显存的段地址

  24.     mov si, 0 ; si用于索引字符
  25.     mov di, 0 ; di用于定位字符存往的es段的偏移地址

  26.     mov cx, 10h
  27.     ; s1控制存放的字符,内循环为10h次,因为一行含10h个字节(注意!十六进制的10表示十进制的16)
  28. s1:
  29.     mov al, ds:[si]
  30.     mov es:[di], al
  31.     inc si
  32.     add di, 2
  33.     loop s1
  34.     ; 将字符存入偶数偏移地址

  35.     mov di, 1
  36.     pop bx
  37.     mov al, ds:10h[bx] ; 取出字符串属性赋给al
  38.     inc bx ; ds:[bx]指向下一行字符串的属性

  39.     mov cx, 10h
  40. s2:
  41.     mov es:[di], al
  42.     add di, 2
  43.     loop s2
  44.     ; 存入字符属性

  45.     pop ax
  46.     add ax, 00A0H ; 将段地址修改到下一行
  47.     loop s3

  48.     mov ax, 4c00h
  49.     int 21h
  50. codesg ends
  51. end start
复制代码
最佳答案
2022-6-30 01:09:40
6YKT6ZKm5LqI 发表于 2022-6-29 23:30
我改了一下,但是还是只能打印出一行,而且打印出来的是"Aelcome to masm!", 第一个字符有问题,可以麻烦 ...

Aelcome to masm
不要忘了你用的debug程序调试的程序
debug程序也要写显存的,而且是你的程序先写,debug程序后写
你的程序先写了一个w,然后debug程序又写了一个A,正好覆盖了你的程序写的那个w
如果debug程序不写显存的话,你怎么能从屏幕上看到当前执行的哪条指令,当前寄存器中的值
debug程序把这些数据写到显存,然后你就从屏幕上看到了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-6-29 19:36:03 | 显示全部楼层

回帖奖励 +3 鱼币

1. 在执行58行的 loop s3 之前,没有 pop cx
2. 27行的 push bx 和45行的 pop bx 之间修改过bx寄存器吗?为什么要保存bx ?
3. 代码成对编写就不会出现这样的问题
  1.     mov cx, 10h
复制代码
  1.     mov cx, 10h
  2. s3:
  3.     loop s3
复制代码
  1.     mov cx, 10h
  2. s3:
  3.     push cx
  4.     pop cx
  5.     loop s3
复制代码

  1.     mov cx, 10h
  2. s3:
  3.     push cx

  4.     push ax
  5.     pop ax

  6.     pop cx
  7.     loop s3
复制代码


像这样,一对一对的写,这样就不会漏掉 pop cx 了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-29 19:37:47 | 显示全部楼层
  1.     mov cx, 10h
  2. s3:
  3.     push cx

  4.     push ax

  5.     ; 其他代码继续在这里写

  6.     pop ax

  7.     pop cx
  8.     loop s3
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-29 23:30:28 | 显示全部楼层

我改了一下,但是还是只能打印出一行,而且打印出来的是"Aelcome to masm!", 第一个字符有问题,可以麻烦再帮我看一下是哪里有问题吗

  1. assume cs: codesg, ds: data, ss: stack

  2. data segment
  3.     db 'welcome to masm!' ; 在显存显示的字符串(16个字符,需要占32个字节,一个字节存放asc码,一个字节存放字符属性)
  4.     db 02h, 24h, 71h ; 定义三种颜色属性(黑底绿字, 绿底红字, 白底蓝字)
  5. data ends

  6. stack segment
  7.     dw 8 dup(0) ; 定义8个字型数据用于存放寄存器的值
  8. stack ends

  9. codesg segment
  10. start:
  11.     mov ax, data
  12.     mov ds, ax
  13.     mov ax, stack
  14.     mov ss, ax
  15.     mov sp, 10h ; 设置栈顶,八个字型数据占16个字节,故偏移地址取10h

  16.     xor bx, bx ; bx清零, 用来索引属性
  17.     mov ax, 0b872h ; 定位第十二行中间位置(作段地址使用): (11 * 160 + (80 - 16) / 2 * 2)在转换为16进制

  18.     mov cx, 3 ; 执行三次循环,打印三行语句
  19. s3:
  20.     push cx ; 为外循环保存相关寄存器的值
  21.     push ax ; 防止段地址的值在内循环中被改变
  22.     ; push bx

  23.     mov es, ax ; 此时es为显存的段地址

  24.     mov si, 0 ; si用于索引字符
  25.     mov di, 0 ; di用于定位字符存往的es段的偏移地址

  26.     mov cx, 10h
  27.     ; s1控制存放的字符,内循环为10h次,因为一行含10h个字节(注意!十六进制的10表示十进制的16)
  28. s1:
  29.     mov al, ds:[si]
  30.     mov es:[di], al
  31.     inc si
  32.     add di, 2
  33.     loop s1
  34.     ; 将字符存入偶数偏移地址

  35.     mov di, 1
  36.     ; pop bx
  37.     mov al, ds:10h[bx] ; 取出字符串属性赋给al
  38.     inc bx ; ds:[bx]指向下一行字符串的属性

  39.     mov cx, 10h
  40. s2:
  41.     mov es:[di], al
  42.     add di, 2
  43.     loop s2
  44.     ; 存入字符属性

  45.     pop ax
  46.     pop cx
  47.     add ax, 00A0H ; 将段地址修改到下一行
  48.     loop s3

  49.     mov ax, 4c00h
  50.     int 21h
  51. codesg ends
  52. end start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-29 23:57:04 | 显示全部楼层

回帖奖励 +3 鱼币

本帖最后由 jackz007 于 2022-6-30 00:22 编辑
  1. assume cs: code , ds: data

  2. data segment para public 'data'
  3.         db 'welcome to masm!'
  4.         db 02h , 24h , 71h     
  5. data ends

  6. stack segment para stack 'stack'       ; 这样定义,编译器能够识别出堆栈段,并自动对号入座 ss 和 sp,不必专门用代码进行初始化。
  7.         dw 800h dup(0)                 ; 必须定义足够大的堆栈空间,否则,如果堆栈空间不够使用,程序将无法正常运行,甚至可能直接奔溃。
  8. stack ends

  9. code segment para public 'code'
  10. start:  mov ax, data
  11.         mov ds, ax
  12.         mov ax,0b800h
  13.         mov es,ax
  14.         mov di,726h
  15.         xor bx,bx
  16.         mov cx,3
  17.         cld
  18. s1:     push cx
  19.         xor si,si
  20.         mov cx,10h
  21. s2:     movsb
  22.         mov al,[10h+bx]
  23.         stosb
  24.         loop s2
  25.         inc bx
  26.         pop cx
  27.         add di,128
  28.         loop s1
  29.         xor ax,ax
  30.         int 16h
  31.         mov ax,4c00h
  32.         int 21h
  33. code ends
  34. end start
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
6YKT6ZKm5LqI + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-6-30 01:01:00 | 显示全部楼层
6YKT6ZKm5LqI 发表于 2022-6-29 23:30
我改了一下,但是还是只能打印出一行,而且打印出来的是"Aelcome to masm!", 第一个字符有问题,可以麻烦 ...

    add ax, 00A0H ; 将段地址修改到下一行
下一行是加 a0 吗?
下一行应该加多少?


试试这个
add ax, 0AH
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-30 01:09:40 | 显示全部楼层    本楼为最佳答案   
6YKT6ZKm5LqI 发表于 2022-6-29 23:30
我改了一下,但是还是只能打印出一行,而且打印出来的是"Aelcome to masm!", 第一个字符有问题,可以麻烦 ...

Aelcome to masm
不要忘了你用的debug程序调试的程序
debug程序也要写显存的,而且是你的程序先写,debug程序后写
你的程序先写了一个w,然后debug程序又写了一个A,正好覆盖了你的程序写的那个w
如果debug程序不写显存的话,你怎么能从屏幕上看到当前执行的哪条指令,当前寄存器中的值
debug程序把这些数据写到显存,然后你就从屏幕上看到了

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
6YKT6ZKm5LqI + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

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

使用道具 举报

发表于 2022-6-30 01:57:29 | 显示全部楼层

回帖奖励 +3 鱼币

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

使用道具 举报

发表于 2022-6-30 01:57:46 | 显示全部楼层

回帖奖励 +3 鱼币

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-10 11:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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