1.硬件2.汇编程序;------------------------------------------------------------------------------------------- ;2017.9.15 ;用nasm重新写原来的代码 ;例程001 ;ex1.asm example_1 ;8088启动,点亮系统板上的LED ;重点在于正确使用程序编辑环境nasm汇编方法EEprom的烧写方法 ; ;ex001----用下载到RAM中的程序点亮系统板上的LED ;8088.asm是汇编源程序 ;8088.bin是编译生成的可下载执行的最终代码 ; ;编译很简单双击make即可自动完成 ; ;Notepad是我计算机上Notepad的快捷方式 ;--------------------------------------------------------------------------------------------- led_port equ 800h ;--------------------------------------------------------------------------------------------- ; org 2000h ;程序将由监控bios下载到内存RAM的地址0000:2000 org 0h start: ;------------------------------------------------------ ;init part ;------------------------------------------------------ mov ax,0 mov ds,ax mov ss,ax mov sp,1fffh mov ax,0f000h mov es,ax CALL COM_INIT call DELAY call DELAY call DELAY st001: nop ;----------------------------------------------------- ;点亮系统板上的LED ;----------------------------------------------------- ;MOV DX,800H ;800H是板子上8个LED的端口地址号 mov dx,led_port MOV AL,0aaH ;一亮一灭间隔点亮 OUT DX,AL call DELAY ;MOV DX,800H ;800H是板子上8个LED的端口地址号 mov dx,led_port MOV AL,00H ;一亮一灭间隔点亮 OUT DX,AL call DELAY mov ah,$ call SEND ; lea di,STR1 ;nasm编译器不认 mov di, STR1 CALL STR_OUT mov di, STR2 CALL STR_OUT ;mov al,01010101b ;mov al,0f0h; ;out 25H,al ;hlt jmp st001 jmp start ;------------------------------------------------------------ ; DELAY PROC NEAR ;------------------------------------------------------------ ;push DELAY: PUSH CX PUSH BX NOP NOP mov bx,10 del1: mov cx,5882 del2: loop del2 dec bx jnz del1 ;pop cx ;pop bx POP BX POP CX RET ;------------------------------------------- ;pc16550 uart send by AH ;------------------------------------------- ;LSTAT EQU 1F5H ;DAT_165 EQU 1F0H ;LINE_165 EQU 1F3H ;LSB_165 EQU 1F0H ;MSB_165 EQU 1F1H ;FIFO_165 EQU 1F2H LSTAT EQU 10AH DAT_165 EQU 100H LINE_165 EQU 106H LSB_165 EQU 100H MSB_165 EQU 102H FIFO_165 EQU 104H SEND: ; PROC NEAR MOV DX,LSTAT WAITx: IN AL,DX TEST AL,20H JZ WAITx MOV AL,AH MOV DX,DAT_165 OUT DX,AL RET ;SEND ENDP ;------------------------------------------- ;串口打印字符串 ;------------------------------------------- STR_OUT :; PROC NEAR nop; LEA DI,STR1 STR_LOOP: ;MOV AH,BYTE PTR [DI] mov ah,byte [es:di];注意rom的寻址与ram的寻址不同的地方 CMP AH,$ JZ STR_EXIT CALL SEND INC DI JMP STR_LOOP STR_EXIT: NOP RET ;STR_OUT ENDP ;--------------------------------------------------- ;16650 init ;--------------------------------------------------- COM_INIT:; PROC NEAR ;LINE MOV AL,8AH ;MOV DX,1F3H MOV DX,LINE_165 OUT DX,AL CALL DELAY ;CALL DELAY ;CALL DELAY ;CALL DELAY ;LSB MOV AL,120 ;MOV DX,1F0H MOV DX,LSB_165 OUT DX,AL CALL DELAY ;CALL DELAY ;CALL DELAY ;CALL DELAY ;MSB MOV AL,0 ;MOV DX,1F1H MOV DX,MSB_165 OUT DX,AL CALL DELAY ;CALL DELAY ;CALL DELAY ;CALL DELAY ;LINE ;MOV AL,0AH MOV AL,03H ;MOV DX,1F3H MOV DX,LINE_165 OUT DX,AL CALL DELAY ;CALL DELAY ;CALL DELAY ;CALL DELAY ;FIFO MOV AL,07H ;MOV DX,1F2H MOV DX,FIFO_165 OUT DX,AL CALL DELAY ;CALL DELAY ;CALL DELAY ;CALL DELAY ;MOV DX,800H MOV DX,led_port MOV AL,0f0H OUT DX,AL RET ;COM_INIT ENDP STR1 DB i8088-HELLO boy or girl! ,13,10,$ STR2 DB 0AH,0DH, ,0dh,0ah,$ ;------------------------------------------------------------------ ;rom boot ;------------------------------------------------------------------ TIMES 0FFF0H-($-$$) DB 0 ;JMP word 0F000H:label ;Not clear why but need long jump for board hardware jmp word 0f000h:0000h ;------------------------------------------------------------------ ;db 55h,55h,55h,55h,55h,55h ;程序结束标志监控bios程序收到后自动跳转到内存0000:2000处执行 ;----------------------------------------------------------------------------------------------3.测试结果保存图片编辑图片移除物体提取文字图片翻译4.误区陷阱起初是用8088单板机测试好的程序进行移植的结果怎么都不对弄了三、四天怀疑各种硬件问题。最后发现是PC16550的片内寄存器地址不一致造成的。代码修改如下然后就一切正常了Happy!