. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验9课业完成思路  [待解决] 回复[ 3次 ]   点击[ 701次 ]  
769698836
[帖 主]   [ 发表时间:2015-02-16 22:24 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2015-02-16 21:57
assume cs:codesg
data segment

db 'welcome to masm!'

data ends


codesg segment

start:mov ax,data
mov ds,ax
mov ax,0b800h
mov es,ax
mov si,0
mov bx,0
mov cx,16
s0:
mov al,ds:[bx]
mov ah,02h
mov es:[si+720h],ax
mov ah,24h
mov es:[si+7c0h],ax
mov ah,71h
mov es:[si+860h],ax
inc bx
add si,2h
loop s0

mov ax,4c00h 
int 21h 
          
           
codesg ends 

end start

这实验完成的思路:ASCII码和属性放到屏幕的中间也就是11,12,13行(屏幕总共有25行),11行的地址是b8000+(11行*160字节在转成16进制就是6E0),因为一行有80个字符,我们要16个字符放中间也就是前面要有32个字符就是64个字节,所以11行的地址就是b8000+6e0+40=b8720,然后12,13行同理就多个A0就好,这题一开始我用就用个bx来寻址发现不行因为代码段的字符是1个字节的,然而到下一次循环(w下一个字符e的时候)地址要加2因为是ax(16位的)所以又加多了一个si,整体的思路比较简单
zxm19820916
[第1楼]   [ 回复时间:2015-03-10 12:25 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2015-03-09 09:33
参考了论坛上的几个程序,分享我的代码,考虑到程序结构、性能优化等。
assume cs:code,ds:data,ss:stack
data segment 
  db 'welcome to masm!' 
  db 00000010b,00100100b,01110001b
data ends 
stack segment
  db 16 dup (0)
stack ends

code segment
start:  
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,16
mov ax,0b872h
mov es,ax
mov bx,0
mov bp,0
mov cx,3
s: 
push cx
mov si,0
mov di,0
mov cx,16
mov ah,ds[bx+16]

s0: 
mov al,ds:[di]
mov es:[bp+si],ax
inc di
add si,2
loop s0

inc bx
add bp,00a0h
pop cx
loop s

mov ax,4c00h
int 21h

code ends
end start
vahe257
[第2楼]   [ 回复时间:2017-07-30 12:14 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2017-07-30 12:11
有什么好高兴的。。一个这么简单的东西 还得意
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved