新手上路,小弟求教各位大虾,特急!如果编译的程序大于64K怎么办?还有求特殊键的ASCII码,谢谢谢谢

ppfree2002 2002-07-22 11:06:02
小弟我在做一份汇编的课程作业,有个题目是编一个文本编辑器,小弟编了一个主程序和两个子程序,可如果只调用一个子程序,EXE文件就有35K,两个同时调用时,就无法编译了,我用的是MASM5.0
还有一些特殊键比如:“上下左右”,ctrl+a,ctrl+b……,alt+a,......,shift+a,....等等
作业很快就要交了,小弟心急,求救各位大虾,谢谢!
...全文
49 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lucia_wfq 2002-07-24
  • 打赏
  • 举报
回复
同意楼上的。
kock 2002-07-22
  • 打赏
  • 举报
回复
代码段拆开成多个,proc改成far
方向键等只有扫描码
自己用debug取
a100
mov ah,0
int 16h
int 1
g=100
然后按相应键,看ah返回值
caps/scroll lock/num等的状态在bios数据区,具体位置你查下资料
giantzz 2002-07-22
  • 打赏
  • 举报
回复
DOS下的程序你做那么大,干啥玩意
giantzz 2002-07-22
  • 打赏
  • 举报
回复
DOS下的程序你做那么大,干啥玩意!
giantzz 2002-07-22
  • 打赏
  • 举报
回复
那你就得切换到保护模式,那样的话就稍较复杂
特殊键就读它的扫描码
wyd95968 2002-07-22
  • 打赏
  • 举报
回复
1、无法编译?那就单独编译,统一链接嘛。当然,kock(荷赫)的方法也行
2、下面这个程序可以显示所有可读键的扫描码和ASCII码:code segment
assume cs:code,ds:code
show macro ; used input output function
local sh1,sh2 ; AX DL CON disp BIN and ' '
push ax ; CX
push cx ; DX
push dx
mov ah,2
mov cx,4
shr dl,cl
cmp dl,0ah
jb sh1
add dl,07h
sh1: add dl,30h
int 21h
pop dx
push dx
and dl,0fh
cmp dl,0ah
jb sh2
add dl,07h
sh2: add dl,30h
mov ah,2
int 21h
mov ah,2
mov dl,20H
int 21h
pop dx
pop cx
pop ax
endm
crlf macro
push dx
mov dl,0ah
disp
mov dl,0dh
disp
pop dx
endm
tip macro a
local tip0,tip1
jmp tip1
tip0: db a,'$'
tip1: push ds
push cs
pop ds
push dx
push ax
mov ah,9
lea dx,tip0
int 21h
pop ax
pop dx
pop ds
endm
start: mov ax,cs
mov ds,ax
reprec:mov ah,0
int 16h
push ax
crlf
mov ah,2
int 16h
test al,80h
jz nextbi1
tip 'INS '
nextbi1:test al,40h
jz nextbi2
tip 'Caps Lock '
nextbi2:test al,20h
jz nextbi3
tip 'Num Lock '
nextbi3:test al,10h
jz nextbi4
tip 'Scroll Lock '
nextbi4:test al,8
jz nextbi5
tip 'Alt '
nextbi5:test al,4
jz nextbi6
tip 'Ctrl '
nextbi6:test al,2
jz nextbi7
tip 'L shift '
nextbi7:test al,1
jz nextbi8
tip 'R shift '
nextbi8:cmp al,0
je nextbi9
mov dl,al
show
crlf
nextbi9:pop ax
mov dl,ah
show
mov dl,al
show
cmp al,1bh
je exits
jmp reprec
exits:mov ah,4ch
int 21h
code ends
end start

awinder 2002-07-22
  • 打赏
  • 举报
回复
你写了些什么呀,要那么大?
dos下的一个段最多有64k,你可以将两个子程序放在不同的段中,用call far ptr调用

asm.yeah.net上有取得键盘扫描吗和组合健码的程序:
获得键盘扫描码


--------------------------------------------------------------------------------

概述:

在编制键盘输入程序时常常要用到一个键的扫描码或ASC码,如用到 Foxpro 的 inkey() 函数,以及用到 BIOS 的 INT 16H时,但找一个编码表不太容易,有时候找到的编码表又不全,无法查到组合键的编码,本程序就是一个随时用来显示按键的ASC码及扫描码的程序,可以用 16 进制和 10 进制同时显示一个键按下和放开的扫描码,以及ASC码,同样也支持组合键。这里是编译好的可执行文件:scancode.com
在本程序中,查表的编程方法可用做参考,一般来说,如果程序有以下的结构:

...
cmp al,value1
jz offset1
cmp al,value2
jz offset2
cmp al,value3
jz offset3
...

且要比较的值很多时,可以考虑查表的方法。程序改为以下结构后,修改起来很容易,可读性也大大增强了,如果要继续添加分支时,只需在表中加上一项就行。

...
table db value1,value2,value3 ...
table1 dw offset1,offset2,offset3 ...

mov di,offset table
mov cx,table的长度
repnz scasb
jnz not_found

dec di
sub di,offset table ;取出表的地址
mov si,di
shl si,1 ;x2
add si,offset table1
jmp [si] ;跳转到表中的地址
...


源程序:

; Scan code viewer
; Aug 3,1995
; by Luo Yun Bin

.286
CODE SEGMENT
ASSUME CS:CODE,DS:CODE
ORG 100H
start:
jmp install

KEY_BUFF DB ? ;INT 9H中按下一个键产生的扫描码
KEY_BUFF1 DB ? ;INT 9H中松开一个键产生的扫描码
AAH DB ?
AAL DB ?

D_COPYRIGHT DB "<< ScanCode viewer >>",0dh,0ah
DB '(C) Copyright by Luo Yun Bin, May 26,1996',0dh,0ah
DB 'Phone: 0576-4114689.',0dh,0ah,0ah
DB "Press any key to view it's scan code...",0dh,0ah
DB 'or press Esc key to return DOS...',0dh,0ah,0ah,24h
D_MES1 DB 'Scan Code: %02shh (%2sd) ... '
DB 'Release: %02shh (%3sd) ... Key: ',0
DW KEY_BUFF,KEY_BUFF,KEY_BUFF1,KEY_BUFF1
D_MES2 DB 0dh,0ah,0
D_MES3 DB 'Key value: %02sh%02shh ...... '
DB '(AH=%sd,AL=%sd)',0dh,0ah,0ah,0
DW AAH,AAL,AAH,AAL
D_MES4 DB 'This is Scan Code viewer by LYB.',0dh,0ah,24h

;键盘扫描码编码表
; 0123456789abcdef ;
KEY_TABLE DB '??1234567890-=??' ;0
DB 'QWERTYUIOP[]??AS' ;1
DB "DFGHJKL;'`?\ZXCV" ;2
DB 'BNM,./?*????????' ;3
DB '??????????-?5?+?' ;4
DB '????????????????' ;5
DB '????????????????' ;6
DB '????????????????' ;7

;特殊键的说明字符串编码表
KEY_TABLE1 DB 3bh,3ch,3dh,3eh,3fh,40h,41h,42h,43h,44h,57h,58h
DB 0eh,0fh,3ah,2ah,1dh,38h,36h,1ch,39h,1
DB 52h,53h,47h,4fh,49h,51h,48h,50h,4bh,4dh,46h,45h

;对应上表
KEY_TABLE1_END EQU THIS BYTE
DW f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12
DW bks,tab,cap,lsh,ctr,alt,rsh,ent,spa,_esc
DW _ins,del,hom,_end,pgu,pgd,up,dow,lef,rig,sco,num

;特殊键的说明字符串
f1 db 'F1',0 ;
f2 db 'F2',0
f3 db 'F3',0
f4 db 'F4',0
f5 db 'F5',0
f6 db 'F6',0
f7 db 'F7',0
f8 db 'F8',0
f9 db 'F9',0
f10 db 'F10',0
f11 db 'F11',0
f12 db 'F12',0
bks db 'Back Space',0
tab db 'Table',0
cap db 'Caps Lock',0
lsh db 'Left Shift',0
ctr db 'Ctrl',0
alt db 'Alt',0
rsh db 'Right Shift',0
ent db 'Enter',0
spa db 'Space',0
_ins db 'Insert',0
del db 'Delete',0
hom db 'Home',0
_end db 'End',0
pgu db 'Page Up',0
pgd db 'Page Down',0
up db 'Up',0
dow db 'Down',0
lef db 'Left',0
rig db 'Right',0
sco db 'Scroll Lock',0
num db 'Num Lock',0
_esc db 'Esc',0

PRINT_KEY PROC

mov bl,key_buff ;取扫描码到BL
xor bh,bh
mov al,key_table [bx] ;查扫描码表

cmp al,'?' ;如果为?则继续查特殊码表
jz pk1
pk0:
call prt_to_scr
ret
pk1:
mov al,key_buff ;在特殊码表内扫描
mov di,offset key_table1
mov cx,offset key_table1_end-offset key_table1
repnz scasb
jnz pk0

dec di
sub di,offset key_table1 ;取出说明字符串地址
mov si,di
shl si,1
add si,offset key_table1_end
mov si,[si]
call printf ;显示到屏幕

ret

PRINT_KEY ENDP

;新的 INT 09H 键盘中断程序
int9:
pushf
pusha
push ds
push es

push cs
pop ds
push cs
pop es

in al,60h ;读入扫描码
mov key_buff,al

test al,80h ;如果>80H则为放开一个键
jnz int9_quit

or al,80h
mov key_buff1,al

mov si,offset d_mes1
call printf
call print_key
mov si,offset d_mes2
call printf
int9_quit:
pop es
pop ds
popa
popf

DB 0EAH
OFF9 DW ?
SEG9 DW ?

install:
mov ah,9 ;显示版权信息
mov dx,offset d_copyright
int 21h

mov ax,3509h ;保留INT 09H的中断向量
int 21h
mov off9,bx
mov seg9,es
mov ax,2509h ;把INT 09H指到 offset int9
mov dx,offset int9
int 21h
push cs
pop es
lop:
mov ah,10h ;扩展键盘输入
int 16h

mov aah,ah ;显示键盘输入的编码
mov aal,al
mov si,offset d_mes3
call printf

cmp key_buff,1 ;如果非按下Esc,继续循环
jnz lop

lds dx,dword ptr off9 ;恢复INT 09H中断向量
mov ax,2509h
int 21h

push cs
pop ds

mov ah,9
mov dx,offset d_mes4
int 21h

int 20h

INCLUDE PRINTF.ASM ;一个公用的显示子程序

CODE ENDS
END START



--------------------------------------------------------------------------------




--------------------------------------------------------------------------------


(C) Copyright by LuoYunBin's Win32 ASM Page,http://asm.yeah.net/
awinder 2002-07-22
  • 打赏
  • 举报
回复
你写了些什么呀,要那么大?
dos下的一个段最多有64k,你可以将两个子程序放在不同的段中,用call far ptr调用

asm.yeah.net上有取得键盘扫描吗和组合健码的程序:
获得键盘扫描码


--------------------------------------------------------------------------------

概述:

在编制键盘输入程序时常常要用到一个键的扫描码或ASC码,如用到 Foxpro 的 inkey() 函数,以及用到 BIOS 的 INT 16H时,但找一个编码表不太容易,有时候找到的编码表又不全,无法查到组合键的编码,本程序就是一个随时用来显示按键的ASC码及扫描码的程序,可以用 16 进制和 10 进制同时显示一个键按下和放开的扫描码,以及ASC码,同样也支持组合键。这里是编译好的可执行文件:scancode.com
在本程序中,查表的编程方法可用做参考,一般来说,如果程序有以下的结构:

...
cmp al,value1
jz offset1
cmp al,value2
jz offset2
cmp al,value3
jz offset3
...

且要比较的值很多时,可以考虑查表的方法。程序改为以下结构后,修改起来很容易,可读性也大大增强了,如果要继续添加分支时,只需在表中加上一项就行。

...
table db value1,value2,value3 ...
table1 dw offset1,offset2,offset3 ...

mov di,offset table
mov cx,table的长度
repnz scasb
jnz not_found

dec di
sub di,offset table ;取出表的地址
mov si,di
shl si,1 ;x2
add si,offset table1
jmp [si] ;跳转到表中的地址
...


源程序:

; Scan code viewer
; Aug 3,1995
; by Luo Yun Bin

.286
CODE SEGMENT
ASSUME CS:CODE,DS:CODE
ORG 100H
start:
jmp install

KEY_BUFF DB ? ;INT 9H中按下一个键产生的扫描码
KEY_BUFF1 DB ? ;INT 9H中松开一个键产生的扫描码
AAH DB ?
AAL DB ?

D_COPYRIGHT DB "<< ScanCode viewer >>",0dh,0ah
DB '(C) Copyright by Luo Yun Bin, May 26,1996',0dh,0ah
DB 'Phone: 0576-4114689.',0dh,0ah,0ah
DB "Press any key to view it's scan code...",0dh,0ah
DB 'or press Esc key to return DOS...',0dh,0ah,0ah,24h
D_MES1 DB 'Scan Code: %02shh (%2sd) ... '
DB 'Release: %02shh (%3sd) ... Key: ',0
DW KEY_BUFF,KEY_BUFF,KEY_BUFF1,KEY_BUFF1
D_MES2 DB 0dh,0ah,0
D_MES3 DB 'Key value: %02sh%02shh ...... '
DB '(AH=%sd,AL=%sd)',0dh,0ah,0ah,0
DW AAH,AAL,AAH,AAL
D_MES4 DB 'This is Scan Code viewer by LYB.',0dh,0ah,24h

;键盘扫描码编码表
; 0123456789abcdef ;
KEY_TABLE DB '??1234567890-=??' ;0
DB 'QWERTYUIOP[]??AS' ;1
DB "DFGHJKL;'`?\ZXCV" ;2
DB 'BNM,./?*????????' ;3
DB '??????????-?5?+?' ;4
DB '????????????????' ;5
DB '????????????????' ;6
DB '????????????????' ;7

;特殊键的说明字符串编码表
KEY_TABLE1 DB 3bh,3ch,3dh,3eh,3fh,40h,41h,42h,43h,44h,57h,58h
DB 0eh,0fh,3ah,2ah,1dh,38h,36h,1ch,39h,1
DB 52h,53h,47h,4fh,49h,51h,48h,50h,4bh,4dh,46h,45h

;对应上表
KEY_TABLE1_END EQU THIS BYTE
DW f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12
DW bks,tab,cap,lsh,ctr,alt,rsh,ent,spa,_esc
DW _ins,del,hom,_end,pgu,pgd,up,dow,lef,rig,sco,num

;特殊键的说明字符串
f1 db 'F1',0 ;
f2 db 'F2',0
f3 db 'F3',0
f4 db 'F4',0
f5 db 'F5',0
f6 db 'F6',0
f7 db 'F7',0
f8 db 'F8',0
f9 db 'F9',0
f10 db 'F10',0
f11 db 'F11',0
f12 db 'F12',0
bks db 'Back Space',0
tab db 'Table',0
cap db 'Caps Lock',0
lsh db 'Left Shift',0
ctr db 'Ctrl',0
alt db 'Alt',0
rsh db 'Right Shift',0
ent db 'Enter',0
spa db 'Space',0
_ins db 'Insert',0
del db 'Delete',0
hom db 'Home',0
_end db 'End',0
pgu db 'Page Up',0
pgd db 'Page Down',0
up db 'Up',0
dow db 'Down',0
lef db 'Left',0
rig db 'Right',0
sco db 'Scroll Lock',0
num db 'Num Lock',0
_esc db 'Esc',0

PRINT_KEY PROC

mov bl,key_buff ;取扫描码到BL
xor bh,bh
mov al,key_table [bx] ;查扫描码表

cmp al,'?' ;如果为?则继续查特殊码表
jz pk1
pk0:
call prt_to_scr
ret
pk1:
mov al,key_buff ;在特殊码表内扫描
mov di,offset key_table1
mov cx,offset key_table1_end-offset key_table1
repnz scasb
jnz pk0

dec di
sub di,offset key_table1 ;取出说明字符串地址
mov si,di
shl si,1
add si,offset key_table1_end
mov si,[si]
call printf ;显示到屏幕

ret

PRINT_KEY ENDP

;新的 INT 09H 键盘中断程序
int9:
pushf
pusha
push ds
push es

push cs
pop ds
push cs
pop es

in al,60h ;读入扫描码
mov key_buff,al

test al,80h ;如果>80H则为放开一个键
jnz int9_quit

or al,80h
mov key_buff1,al

mov si,offset d_mes1
call printf
call print_key
mov si,offset d_mes2
call printf
int9_quit:
pop es
pop ds
popa
popf

DB 0EAH
OFF9 DW ?
SEG9 DW ?

install:
mov ah,9 ;显示版权信息
mov dx,offset d_copyright
int 21h

mov ax,3509h ;保留INT 09H的中断向量
int 21h
mov off9,bx
mov seg9,es
mov ax,2509h ;把INT 09H指到 offset int9
mov dx,offset int9
int 21h
push cs
pop es
lop:
mov ah,10h ;扩展键盘输入
int 16h

mov aah,ah ;显示键盘输入的编码
mov aal,al
mov si,offset d_mes3
call printf

cmp key_buff,1 ;如果非按下Esc,继续循环
jnz lop

lds dx,dword ptr off9 ;恢复INT 09H中断向量
mov ax,2509h
int 21h

push cs
pop ds

mov ah,9
mov dx,offset d_mes4
int 21h

int 20h

INCLUDE PRINTF.ASM ;一个公用的显示子程序

CODE ENDS
END START



--------------------------------------------------------------------------------




--------------------------------------------------------------------------------


(C) Copyright by LuoYunBin's Win32 ASM Page,http://asm.yeah.net/

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧