汇编 10进制转16进制 冒泡排序

2009年10月24日 06:16

最后一个汇编实验里用到的,这两个还是很有用的,于是贴上来

.model small
.stack 200h
.data
BUF  DB 255 DUP(?)
NUMBER DW ?
FLAG DB ?
LEN DB 5
CRLN DB 0AH,0DH,24H
TEMP DW 0,1,10,100,1000,10000
.CODE

NEWLINE macro
        LEA DX,CRLN
        mov ah,9
        int 21h
ENDM

START:
        mov ax,@data
        mov ds,ax

        MOV BUF,'-'
        MOV BUF+1,'5'
        MOV BUF+2,'3'
        MOV BUF+3,'3'
        MOV BUF+4,'4'
       
        XOR SI,SI ;第几个字符
        XOR BH,BH
        MOV BL,LEN ;bx 长度
        ADD BX,BX
        XOR CX,CX ;保存最后结果
        MOV DL,BUF[SI] ;检负
        CMP DL,'-'
        JNE OP
        MOV FLAG,1
        INC SI
        SUB BX,2
OP:
        MOV AX,TEMP[BX] ;保存基数
        XOR DH,DH
        MOV DL,BUF[SI] ;基数要乘的数码
        SUB DL,30H
        IMUL DX
        ADD CX,AX
        INC SI
        SUB BX,2
        JNZ OP

        MOV AL,FLAG
        CMP AL,0
        JE OP2
        NEG CX
OP2:
        MOV AX,CX
        CALL SHOWAXD
        MOV FLAG,0

        ;暂停,任意键关闭
        mov ah,1
        int 21h
        mov ah,4ch     ;结束,可以修改al设置返回码
        int 21h

SHOWAXD PROC NEAR USES AX BX CX DX SI
......
SHOWAXD ENDP

END START

 

评论(0) 阅读(2743)

将AX以10进制显示出来

2009年10月22日 20:00

写汇编实验7遇到的问题,以前懒,这次只好硬着头皮写了

ret曾因为前面循环而少push了一次,不停在子程序里循环跳不出来了

以前看书时不以为然,这次可算是亲身体会了

评论(0) 阅读(1361)

汇编的贪吃蛇

2009年10月06日 02:32

刚学 写着玩 挺ugly的 有bug也不管了

snake.png

源码和程序 http://www.dbank.com/download.action?k=5cb776e3eaf3464d9ccc3c8b74a5b4c2

评论(0) 阅读(1654)

汇编笔记

2009年10月01日 03:36

串处理指令判断字符串相等

LEA SI, PSW1 ;源字符串
LEA DI, BUFF ;目的字符串
MOV CX, BX ;计数
CLD ;使DF=0,地址自动增量
REPE CMPSB ;比较字符串PSW1和BUFF
.IF ZERO? ;若字符串的相应字符相同
……

清屏幕

Clear PROC Near Uses AX BX CX DX ;清屏幕,并保护所用寄存器
        MOV CL, 0
        MOV CH, 0
        MOV DL, 79
        MOV DH, 24 ;(0,0)-(24,79)是屏幕的左上角和右下角
        MOV BH, 7
        MOV AL, 0 ;AL=滚动行数(0——清窗口)
        MOV AH, 6 ;AH=06H——向上滚屏
        INT 10H
        RET
Clear ENDP
BIOS显示彩色字符串
;在位置(5,20)的位置显示蓝色字符串
MOV BP, OFFSET MSG1 ;显示字符串首地址
MOV BL, 09H ;属性:蓝色
MOV CX, 0AH ;显示字符串长度:10
MOV AL, 0 ;写方式 (0~3)
MOV BH, 0 ;页号
MOV DH, 5 ;起始行
MOV DL, 20 ;起始列
MOV AH, 13H
INT 10H ;使用中断10H之功能13H来显示字符串

暂停,任意键关闭 DOS 和 BIOS

mov ah,1
int 21h

mov ah,0
int 16h

检测上下左右

 .IF AH==50H ;↓
        inc location
.ELSEIF AH==48H ;↑
        DEC location
.ELSEIF AH==4DH ;→
        inc location+1
.ELSEIF AH==4BH ;←
        DEC location+1
 .ENDIF

延时程序

WAITF PROC NEAR ;延时子程序
        PUSH AX
WAITF1:
        IN AL,61H
        AND AL,10H
        CMP AL,AH
        JE WAITF1
        MOV AH,AL
        LOOP WAITF1
        POP AX
        RET
WAITF ENDP

…………

;调用
MOV CX,33144
CALL WAITF

书上的以16进制显示BX寄存器内容的程序 改正一点地方

SHOWBX PROC near
        MOV CH,4
        MOV CL,4
rotate:
        ROL BX,CL
        MOV AL,BL
        AND AL,0FH
        ADD AL,30H
        CMP AL,3AH
        JL printit
        ADD AL,7H
printit:
        MOV DL,AL
        MOV AH,2
        INT 21H
        DEC CH
        JNZ rotate
        RET
SHOWBX ENDP

两个有用的输出宏

printchar macro char,len,row,lie,col ;输出字符到指定位置
 mov ah,2
 mov bh,0
 mov dh,row
 mov dl,lie
 int 10h
 mov bl,col
 mov bh,0
 mov al,char
 mov ah,09h
 mov cx,len
 int 10h
endm

printstr macro string,len,row,lie ;输出字符串到指定位置
 ;mov ah,13
 ;mov bp,seg string
 ;mov es,bp
 mov bp,offset string
 mov cx,len
 mov dh,row
 mov dl,lie
 mov bh,0
 mov ax,1300h
 mov bl,6
 int 10h
endm

 不堵塞的按键检测

in al,60h

 

 

 

 

 

 

评论(0) 阅读(1170)

汇编 以16进制显示AX

2009年9月30日 03:55

开始用MasmPlus 因为觉得一步完成很好用 还是不会调试 于是就把AX打出来吧

 

.model small
.stack 200h
.data
szLetter db '0123456789ABCDEF','H',0DH,0AH,'$'
.CODE

SHOWAX PROC uses AX BX CX DX
        mov cl,16
AGAIN:
        PUSH AX
        SUB CL,4
        SHR AX,CL ;移动到需要的位数
        MOV BL,AL
        AND BX,0FH
        MOV DL,szLetter[BX] ;查表
        mov ah,2
        int 21h
        POP AX
        CMP CL,0
        JNE AGAIN
        LEA DX,szLetter[16] ;H和回车
        mov ah,9
        int 21h
        RET
SHOWAX ENDP

START:
mov ax,@data
mov ds,ax

mov ax,6549h
INVOKE SHOWAX

;暂停,任意键关闭
mov ah,1
int 21h
mov ah,4ch     ;结束,可以修改al设置返回码
int 21h
END START

 

 

评论(0) 阅读(1588)