. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  一个循环完成实验9(17行代码)  [待解决] 回复[ 3次 ]   点击[ 296次 ]  
yunbing.com
[帖 主]   [ 发表时间:2013-02-26 13:21 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-02-26 12:52
'welcome to masm!'字符总数是16。
要让字符出现于屏幕正中间(即第13行中间位置),
其首字符地址:(160*13)+((160-16*2)/2)=2144 (860H)。
题目要求共显示三种样式,在此安排分别显示到第11行、13行、15行(隔行显示)。
第11行首字符地址:2144-160*2=1824 (720H)
第15行首字符地址:2144+160*2=2464 (9A0H)
以下为完整代码——

assume cs:codesg;ds:datasg

datasg segment
  db 'welcome to masm!'
datasg ends

codesg segment
start:
  mov ax,datasg
  mov ds,ax
  mov ax,0B800H
  mov es,ax

  mov bx,0
  mov si,0
  mov cx,16
  s:
    mov al,[bx]
    mov ah,02H           ;00000010B 绿色字
    mov es:[720H+si],ax  ;写入第11行
    mov ah,24H           ;00100100B 绿底红色
    mov es:[860H+si],ax  ;写入第13行
    mov ah,71H           ;01110001B 白底蓝色
    mov es:[9A0H+si],ax  ;写入第15行
    inc bx
    add si,2
  loop s

  mov ax,4c00h
  int 21h
codesg ends
end start

以上code部分的核心代码共17行。
jimmy.shine
[第1楼]   [ 回复时间:2013-03-01 18:33 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-03-01 18:30
没有考虑在屏幕中间显示,那个很简单,其它的代码很简单
ASSUME CS:CODE,DS:DATA

DATA SEGMENT
   DB 'Welcome to masm!'
   DB 8 DUP (02H)
   DB 3 DUP (24H)
   DB 5 DUP (71H)
DATA ENDS

CODE SEGMENT
START:
        MOV AX,DATA
        MOV DS,AX        
        MOV BX,0
        
        MOV AX,0B800H
        MOV ES,AX
        MOV SI,0
        
        MOV CX,16        
S1:        MOV AL,[BX]
        MOV AH,[BX+16]
        MOV ES:[SI],AX
        ADD BX,1
        ADD SI,2
        LOOP S1
        
        MOV AX,4C00H
        INT 21H
CODE ENDS

END START;
a5156520
[第2楼]   [ 回复时间:2013-04-21 16:21 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-01-27 22:38
楼主好人.
zdt3476
[第3楼]   [ 回复时间:2013-04-25 13:56 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-04-04 15:35
给了很多启发,谢谢!
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved