当前位置:编程学习 > 汇编语言 >>

汇编 在屏幕上显示AX的内容

如何让这个程序在屏幕输出10进制的AX的内容 data segment buffer1 db 0,1,2,3,4 buffer2 db 0,1,2,3,4 buffer3 db 100 dup(?) data ends code segment assume cs:code,ds:data,es:data main proc far begin: push ds mov ax,0000h push ax mov ax,data mov ds,ax mov es,ax lea si,buffer1 lea bx,buffer2 add bx,4 lea di,buffer3 mov cx,5 m: mov al,[si] add al,[bx] mov [di],al inc si dec bx inc di dec cx jnz m mov ah,4ch int 21h ret main endp code ends end begin
补充:这个程序就是将Buffer1和Buffer2中的数相加然后将结果放在Buffer3中,只是程序运行除了Bebug看不到结果,就是想将它改成能在屏幕上显示AX中的运算结果。
追问:这个程序就是将Buffer1和Buffer2中的数相加然后将结果放在Buffer3中,只是程序运行除了Bebug看不到结果,就是想将它改成能在屏幕上显示AX中的运算结果。
答案:stack segment para stack 'stack'    
    db 8 dup('mystack ') ;共有8*8个字节 
stack ends  
    
data segment    
buffer1 db 0,1,2,3,4    
buffer2 db 0,1,2,3,4    
buffer3 db 100 dup(?)   
sAscii  db 6 dup(?)    ;新增的,用来存放输出的数字串的   
data ends   
    
code segment    
        assume cs:code,ds:data,es:data,ss:stack 
main proc far   
begin:  push ds 
        mov ax,0000h    
        push ax 
            
        mov ax,data 
        mov ds,ax   
        mov es,ax   
            
        lea si,buffer1  
        lea bx,buffer2  
        add bx,4    
            
        lea di,buffer3  
        mov cx,5    
            
m:      mov al,[si] 
        add al,[bx] 
        mov [di],al 
        inc si    ;buffer1的指针    
        dec bx    ;buffer2的指针    
        inc di    ;buffer3的指针    
        loop m   
        ;-------------------------------------  
        ;显示数据   
        ;新增的内容:    
        mov cx,5    ;有5条数据要输出    
        xor si,si   ;si为数组下标,初值指向第0个元素 
GetNext:    
        ;显示数据是由disp_number子程序实现的,   
        ;它要求把要显示的数据放在bx中:  
        xor bx,bx            ;因为要显示的数据只有一个字节,所以清bx 
        mov bl,buffer3[si]   ;从数组读数据进bl(bx是disp_number的参数)   
        call disp_number     ;调用子程序,它把数转换成ASCII串并输出到屏幕    
            
        ;每显示一个数之后追加显示一个逗号,最后一个数没有    
        .IF cx>1        ;如果不是最后一个数,则: 
            mov ah,2    ;传入显示ASCII符的功能号    
            mov dl,','  ;传入要显示的字符   
            int 21h     ;调用DOS    
        .ENDIF  
        
        inc si          ;调整数组下标,指向下一个    
        loop GetNext    ;如果cx!=0,就进入下一个循环 
        ;--------------------------------------------   
        ;终止程序   
        mov ah,4ch  
        mov al,0    ;al是返回码,应该设置一下    
        int 21h     
        ret         ;返回DOS    
main endp   
;---------------------------------------------------------------------  
; 过程名:disp_number    
; 功能:将bx中的无符号整数转换成十进制串并送屏幕输出 
; 输入参数:bx = 要转换并输出的数据(无符号整数)  
; 返回:无   
;---------------------------------------------------------------------  
disp_number proc near   
    push si        ;保存寄存器旧值  
    push cx     ;   
    ;sASCii是存放转换后的串的   
    ;首先将这个串的最后一个字节送入串结束符'$'  
    mov si, offset sAscii+5 ;让si指向最后一个字节   
    mov byte ptr [si] ,'$'  ;obuf的最后一位放'$'    
    dec si                  ;修正si,使其指向要输出的数字串的个位数位置  
    mov cx,10               ;设置cx等于除数10   
    mov ax,bx               ;bx即为要输出的数,送ax,作为被除数   
again:  
    mov dx,0    ;无符号数扩展,它下面用来存放余数    
    div cx      ;dx:ax := ax/cx(结果:dx=余数,ax=商) 
    add dl,30h  ;把余数转换为相应的ASCII码  
    mov [si],dl ;存进相应的位置(因为是碾转除,dl第一次得个位,第二次得十位...)    
    dec si      ;调整存放ASCII数据的指针(注意是减1,即由个位调整为十位...)   
    cmp ax,0    ;是0吗(经过碾转除以后,商可都除尽吗?0表示商没有了)   
    jnz again   ;是就跳转进入下一循环(即商还有就再进入循环做除法)   
                ;否则没有了,就准备输出转换后的串    
    inc si      ;修正输出的串的首地址(上面si向左移了一位,可是没用到,所以再调回来)   
    mov dx,si   ;首地址送dx 
    mov ah,9    
    int 21h     ;显示器输出字符串   
        
    pop cx      ;恢复寄存器旧值 
    pop si      ;   
    ret 
disp_number    endp 
    
code ends   
    end main
其他:减去30h 就行 恕我眼拙看不出你的程序是这个意思。再请问一下你是不是想输出ax里面的字符的ASCII码
比如你存的是一个空格,ASCII码是20h,你想得到的输出结果是20吗?
首先就是先把ax里面的内容存起来,然后对ax进行逻辑右移得到高四位的值就是2,你要加上30h输出就是'2'了,然后再把原来ax里的值取回来,再和0fh进行and运算,得到ax的低四位,也就是0,同样加上30h,输出就是'0'了. 这个,也是用十进制输出AX中的数:
http://hi.zhaoxi.net/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/7d8efcb239a3a7bbd8335ae1.html MOV AH,2
INT 21H
这条指令的意思是把AL里的内容在屏幕上显示,你可以把你要显示的内容先传入AL中在执行上述指令

上一个:求汇编程序指错:利用计数器T1(p3.5)记录脉冲的个数,每计满10个脉冲,使灯亮1s,然后重新计数。
下一个:汇编语言能在直接在屏幕中输出双引号吗?

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,