. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验9,交作业。  [已解决] 回复[ 7次 ]   点击[ 318次 ]  
jjch224
[帖 主]   [ 发表时间:2010-07-17 22:43 ]   [引用]   [回复]   [ top ] 
荣誉值:16
信誉值:0
注册日期:2010-07-09 09:48
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 cx,10h
        mov si,0h
        mov di,0h        

s:
        mov bx,0h;找不到中间位置,只能用bx来代替了,郁闷中。
        mov ah,02h
        mov al,ds:[si]
        mov es:[bx+40h+di],ax
        add bx,0a0h
        mov ah,24h
        mov al,ds:[si]
        mov es:[bx+40h+di],ax
        add bx,0a0h
        mov ah,71h
        mov al,ds:[si]
        mov es:[bx+40h+di],ax
        mov bx,0b40h
        inc si
        add di,2h
        loop s        
        mov ax,4c00h
        int 21h
codesg ends
end start
感觉这个实验没能很好的总结前面的知识,因为jmp和jcxz这些指令都用不上,要不就是用在这里面比较便扭。不知c中的if、 else if的语句在汇编里面是咋整的?
jjch224
[第1楼]   [ 回复时间:2010-07-17 23:04 ]   [引用]   [回复]   [ top ] 
荣誉值:16
信誉值:0
注册日期:2010-07-09 09:48
另外写了个双循环的。
assume cs:codesg
data segment
        db 'welcome to masm!'
data ends
stacksg segment
        dw 2 dup(0,0,0,0)
stacksg ends
codesg segment
start:
        mov ax,data
        mov ds,ax
        mov ax,0b800h
        mov es,ax
        mov ax,stacksg
        mov ss,ax
        mov sp,10h
        
        mov cx,10h
        mov si,0h
        mov di,0h
s:        
        push cx
        mov ax,7100h
        push ax
        mov ax,2400h
        push ax
        mov ax,200h
        push ax        
        mov cx,3h
        mov bx,0h
        
s1:        pop ax
        mov al,ds:[si]
        mov es:[bx+40h+di],ax
        add bx,0a0h
        loop s1        
        pop cx        
        inc si
        add di,2h
        loop s        
        
        mov ax,4c00h
        int 21h
codesg ends
end start
jjch224
[第2楼]   [ 回复时间:2010-07-17 23:30 ]   [引用]   [回复]   [ top ] 
荣誉值:16
信誉值:0
注册日期:2010-07-09 09:48
初始化语句增加了不少,栈的用法有点生硬了,因为在定义栈的时候,如果做了初始化,碍于sp指向栈顶,我们需要的数值也取不出来,除非,先push。极度郁闷。
jjch224
[第3楼]   [ 回复时间:2010-07-17 23:31 ]   [引用]   [回复]   [ top ] 
荣誉值:16
信誉值:0
注册日期:2010-07-09 09:48
再次改进,请教高手,这样用栈合法不??
assume cs:codesg
data segment
        db 'welcome to masm!'
data ends
stacksg segment
        dw 0,0,0,0
        dw 16 dup(200h,2400h,7100h)
stacksg ends
codesg segment
start:
        mov ax,data
        mov ds,ax
        mov ax,0b800h
        mov es,ax
        mov ax,stacksg
        mov ss,ax
        mov sp,8h
        
        mov cx,10h
        mov si,0h
        mov di,0h
s:        
        mov dx,cx
        mov cx,3h
        mov bx,0h
s1:        pop ax
        mov al,ds:[si]
        mov es:[bx+40h+di],ax
        add bx,0a0h
        loop s1                
        mov cx,dx
        inc si
        add di,2h
        loop s        
        
        mov ax,4c00h
        int 21h
codesg ends
end start
jjch224
[第4楼]   [ 回复时间:2010-07-19 11:10 ]   [引用]   [回复]   [ top ] 
荣誉值:16
信誉值:0
注册日期:2010-07-09 09:48
一页25行,我们要显示3行在中间,那么中间位置应该是(25-3)/2,也就是11 12 13行。一行占a0h个字节,由此可以推出中间位置的第一行应该是11*160转化为十六进制就是6e0h,第二行6e0h+a0h,第三行6e0h+a0h+a0h。
masmaster
[第5楼]   [ 回复时间:2010-07-19 13:09 ]   [引用]   [回复]   [ top ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
good~~~~job~
towersimper
[第6楼]   [ 回复时间:2010-07-23 15:36 ]   [引用]   [回复]   [ top ] 
荣誉值:9
信誉值:3
注册日期:2008-06-12 09:16
一页25行,我们要显示3行在中间,那么中间位置应该是(25-3)/2,也就是11 12 13行。一行占a0h个字节,由此可以推出中间位置的第一行应该是11*160转化为十六进制就是6e0h,第二行6e0h+a0h,第三行6e0h+a0h+a0h。
------------------
回复:找的位置跟我一样。不错。呵呵。
jjch224
[第7楼]   [ 回复时间:2010-07-24 12:30 ]   [引用]   [回复]   [ top ] 
荣誉值:16
信誉值:0
注册日期:2010-07-09 09:48
此贴由 贴主 于 [ 2010-07-24 12:30 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved