我写了下面的代码。当我在emu8086中模拟它时,只是在屏幕上显示小写字母。
我想通过使用另一个中断和函数将这些字符转换为大写。怎么办呢?
http://<myserver>/product/the-name-of-my-product
答案 0 :(得分:1)
none emu8086中断提供小写到大写转换的服务。
自行转换 - 在使用mov dl,[bx]
dl
之后,您使用int 21h
中的字符值,然后再使用dl
的“显示输出”功能。所以在这两者之间你可以修改字符的值。
研究ASCII encoding的内容,了解and
中的数字,以及DOS将在屏幕上显示的内容。然后想想你想要操纵哪些数字以及以何种方式操纵。将小写ASCII转换为大写ASCII字母可能需要单 ; convert DL: values [4, 5, 6, 7] -> [10, 11, 8, 9]
; keep other values intact
cmp dl,4
jb keepIntact ; when DL < 4, jump (jb = jump below)
cmp dl,7
ja keepIntact ; when DL > 7, jump (ja = jump above)
xor dl,14 ; do magic (calculates new value)
; continue with the same code as values 0-4 and 8-255
keepIntact:
; here DL contains patched/intact value, as wanted
条指令,如果您可以安全地假设只有字母通过,但您可能希望将“空格”保留为“空格”,甚至保留数字和其他非 - 字符。
就像假设您想要将值从4更改为7到值[10,11,8,9],并且您希望保持其他值不变:
and dl,0DFh
将小写ASCII字母转换为大写的一种方法是执行“
122
”..它会将值97-122转换为65-90(并“损坏”其他各种...并保留一些,如同65-90将保持不变,因此输入中的大写字母不会被修改。)要了解这是如何工作的,请在二进制文件中查看值'a'
(0DFh
),然后查看;Move F0h to 40:17 ;# this is trying to explain what code below does ;# which is: store word value 0x00F0 at absolute ;# physical memory address 0040:0017 MOV DS,40h MOV BX,17h ;# ds:bx points to 0040:0017 MOV AX,0F0h MOV [BX], AX ;# store 0x00F0 at [ds:bx] ;# this just terminates DOS program, not related to "locks" mov ah,004C ;terminate program int 21h
的二进制文件,并进行数学运算。
关于link来自评论,有段落“打开所有键盘”锁定“s”代码(我在“;#”之后添加了我的评论):
int 9
我在PDF中找到了更详细的BIOS和键盘说明(看起来由作者发布,个人电子使用合法,不打印(购买打印版纸质硬拷贝))。< / p>
现在我将尝试解释一下,这段代码是什么,但一般来说,如果你没有从你的书中得到它,那么我担心我的简短解释可能会更糟。
在16位模式下,键盘由BIOS中断处理。在这种情况下,“中断”表示处理程序的代码,即int 9
,它由微控制器接收来自键盘设备的输入,将其转换为扫描码并将该值放在60h I / O端口来执行。这个int 9
处理程序然后从扫描代码转换为ASCII(加上根据当前状态ctrl / shift / caps lock / num lock / ...的转换)并使其可用于通过BIOS或DOS中断读取键盘的其他程序。将0F0h放入0040:0017的内存位置会影响int 10h
处理程序认为用户设置了“大写锁定”,因此用户输入的任何下一个字母键盘都将为大写(除非用户也持有shift打字的时候)。
一般情况下,这是旧DOS时间的内部,你不应该注意这一点,它在MS-Windows / linux的世界中没有用。 Emu8086可能会部分模拟这个功能,但我不会赌它,它主要是模仿int 21h
/ int 9h
服务,只有少数几个,我认为它不会达到如此之长它还将模拟虚拟0040:0017处dosbox
检查值的全部内部功能。 {{1}} 16位PC模拟器 (使许多旧的DOS软件正常工作)。
但是再次,这会影响键盘的状态(我的意思是旧的键盘,无论是原装的IBM PC键盘,还是更“现代”的PS / 2键盘。今天许多键盘通过USB连接,以完全不同的方式处理需要不同的BIOS处理程序才能使它们工作)。
它不会转换任何字符串。这让我想知道你究竟在询问什么。
答案 1 :(得分:0)
您不需要中断,您只需要检查DL是否在&#39; a&#39; ...&#39; z&#39;在显示之前:
LEA BX, MSG
MOV AH, 2
MOV CX, 26
DON: MOV DL, [BX]
cmp dl, 'a'
jb display ;◄■■ IF DL < 'a' (JB=JUMP IF BELOW).
cmp dl, 'z'
ja display ;◄■■ IF DL > 'z' (JA=JUMP IF ABOVE).
sub dl, 32 ;◄■■ CONVERT LOWERCASE TO UPPERCASE ('a'=97, 'A'=65).
display:
INT 21H
INC BX
LOOP DON
RET