|
主题 : : 实验9课业完成思路 [待解决] |
回复[ 3次 ]
点击[ 701次 ] | |
|
|
|
|
[帖 主]
[ 发表时间: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,整体的思路比较简单 | | |
|
|
|
|
[第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 | | |
|
|
|
|
[第2楼]
[ 回复时间:2017-07-30 12:14 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2017-07-30 12:11 |
|
|