|
发表于 2023-8-1 20:24:14
|
显示全部楼层
你好!根据你提供的代码,你的目的是将字符串"welcome to masm"复制到段地址0B800h,以显示在屏幕上。根据你的描述,问题是目标地址的数据不正确。
问题出在 mov ax, 0B800h 这一行。在这行代码之后,你又执行了 mov es, ax 。这两行代码将段地址0B800h放入寄存器ES中,这是用于显示文本的显存段地址,但同时又把段地址放入AX寄存器中。接着,你又将数据段的地址放入DS寄存器中,这会导致DS和ES都指向同一个段地址,即0B800h。
在循环复制字符串的过程中,你用DS寄存器读取字符串的数据,然后使用ES寄存器写入目标地址。因为DS和ES都指向相同的段地址,所以你实际上是在同一段内复制数据,而不是从数据段复制到显存段。
为了解决这个问题,你应该将目标地址的段地址0B800h存储在ES寄存器中,然后将数据段的地址存储在DS寄存器中。这样,你就能正确地从数据段复制数据到显存段。
以下是修改后的代码:
- assume cs:code, ds:data
- data segment
- db 'welcome to masm'
- data ends
- code segment
- start:
- mov ax, 0B800h ; 将显存段地址0B800h放入AX寄存器
- mov es, ax ; 将显存段地址存储在ES寄存器中
- mov ax, SEG data ; 将数据段的段地址存储在AX寄存器
- mov ds, ax ; 将数据段地址存储在DS寄存器
- mov cx, 15 ; 循环计数器,复制15个字符
- mov si, 0 ; 源地址偏移量
- mov di, 0 ; 目标地址偏移量
- s:
- mov al, ds:[si] ; 从数据段读取字符
- mov es:[di], al ; 将字符写入显存段
- mov ah, 2h ; 设置字符颜色(绿色)
- mov es:[di+1], ah ; 将颜色信息写入显存段
- inc si ; 增加源地址偏移量
- add di, 2 ; 增加目标地址偏移量,每个字符占2个字节
- loop s ; 循环复制
- mov ax, 4c00h ; 退出程序
- int 21h
- code ends
- end start
复制代码
这样,你应该能正确地将数据从数据段复制到显存段,从而在屏幕上显示出"welcome to masm"这个字符串。希望能对你有所帮助!如果还有其他问题,请随时向我询问。 |
|