以下为完整测试通过代码,0~9的立方表存于table中,按esc退出程序,程序查表结果以四位十进制输出,若要十六进制输出可自己做微小调整,最后附带部分dos环境测试结果
-----------------------------------------------------------------------------------
; multi-segment executable file template.
data segment
; add your data here!
table dw 0000h,0001h,0008h,001bh,0040h,007dh,00d8h,0157h,0200h,02d9h
ends
stack segment
dw 128 dup(0)
ends
code segment
start:
; set segment registers:
mov ax, data
mov ds, ax
mov es, ax
; add your code here
again:
call rechar;in:none out:al
call newline_b
cmp al,1bh
jz exit
mov bx,table
call checktable;in:bx al out:ax
call outax
jmp again
exit:
mov ax, 4c00h ; exit to operating system.
int 21h
;call rechar ;in:none out:al
rechar proc near
again1:
call newline_b ;in:none out:none
mov ah,01h
int 21h
cmp al,1bh
jz oute
cmp al,30h
jl again1
cmp al,39h
jg again1
sub al,30h
oute:
ret
rechar endp
;call newline_b ;in:none out:none
newline_b proc near ;none effect
push ax
push dx
mov ah,02h
mov dl,0ah
int 21h
mov dl,0dh
int 21h
pop dx
pop ax
ret
newline_b endp
;call checktable ;in:bx al out:ax
checktable proc near
push cx
shl al,01h
mov ah,al
inc ah
xlat
mov cl,al
mov al,ah
xlat
mov ch,al
mov ax,cx
pop cx
ret
checktable endp
;call outax ;in:ax out:ax_Denum
outax proc near
push bx
mov dl,00h
call outdl;in:dl out:dl_asciiNum
mov bl,64h
div bl
mov dl,al
call outdl
mov al,ah
xor ah,ah
mov bl,0ah
div bl
mov dl,al
call outdl
mov dl,ah
call outdl
pop bx
ret
outax endp
;call outdl ;in:dl out:dl_asciiNum
outdl proc near
push ax
add dl,30h
mov ah,02h
int 21h
pop ax
ret
outdl endp
ends
end start ; set entry point and stop the assembler.
------------------------------------------------------------------
C:\CODEST~1>xlat.exe
0
0000
1
0001
2
0008
5
0125
7
0343
9
0729
8
0512
←
C:\CODEST~1>
不知楼上用的什么编译软件。
楼上的程序,用MASM.EXE编译,提示有些错误。
经过修改,可以通过编译了。
运行结果正常。
程序如下:
;--------------------------------------------------------------------
DATA SEGMENT
; 立方数据表格.
TABLE DW 0, 1, 8, 27, 64, 125, 6*6*6, 7*7*7, 8*8*8, 9*9*9
DATA ENDS
;--------------------------
STACK SEGMENT
DW 128 DUP(0)
STACK ENDS
;--------------------------
CODE SEGMENT
ASSUME CS: CODE, DS: DATA, SS: STACK
START:
MOV AX, DATA
MOV DS, AX
MOV ES, AX
M_LOOP:
MOV AH, 1
INT 21H
CMP AL, 1BH
JZ EXIT
CMP AL, 30H
JL M_LOOP
CMP AL, 39H
JG M_LOOP
SUB AL, 30H
;------------------------------
MOV BX, TABLE
PUSH CX
SHL AL, 1
MOV AH, AL
INC AH
XLAT
MOV CL, AL
MOV AL, AH
XLAT
MOV CH, AL
MOV AX, CX
POP CX
;------------------------------
CALL CR_LF
CALL OUT_AX
CALL CR_LF
JMP M_LOOP
;------------------------------
EXIT:
MOV AX, 4C00H ;EXIT TO OPERATING SYSTEM.
INT 21H
;--------------------------------------------
OUT_AX PROC NEAR
PUSH BX
MOV DL, 0
CALL OUT_ASC
MOV BL, 100
DIV BL
MOV DL, AL
CALL OUT_ASC
MOV AL, AH
XOR AH, AH
MOV BL, 10
DIV BL
MOV DL, AL
CALL OUT_ASC
MOV DL, AH
CALL OUT_ASC
POP BX
RET
OUT_AX ENDP
;--------------------------------------------
OUT_ASC PROC NEAR
ADD DL, 30H
CALL OUT_DL
RET
OUT_ASC ENDP
;--------------------------------------------
CR_LF PROC NEAR
MOV DL, 10
CALL OUT_DL
MOV DL, 13
CALL OUT_DL
RET
CR_LF ENDP
;--------------------------------------------
OUT_DL PROC NEAR
PUSH AX
MOV AH, 02H
INT 21H
POP AX
RET
OUT_DL ENDP
;--------------------------------------------
CODE ENDS
END START
------------------------------------------------------------------