如何使用中断将此字符串转换为大写?

时间:2016-12-15 21:44:43

标签: assembly emu8086

我写了下面的代码。当我在emu8086中模拟它时,只是在屏幕上显示小写字母。

我想通过使用另一个中断和函数将这些字符转换为大写。怎么办呢?

http://<myserver>/product/the-name-of-my-product

2 个答案:

答案 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