如何比较 8086 中的两个字母?
How do I compare two letters in 8086?
array db 13,10,10,"pineapple $"
lea si, array+2
mov al, [si]
cmp al, 'A'
这里,字符串值是先转换成ascii再比较吗?
另外,13、10 和 10 意味着什么?
array+0和array+1不应该分别包含字符串的总大小和实际大小吗?
像 array db 13,10,10,"pineapple $"
这样的行在内存中创建一个 字节 的字符串:
13, 10, 10, 112, 105, 110, 101, 97, 112, 112, 108, 101, 32, 36
在 16 位编程中,当您看到一个以 $ 字符结尾的字符串时,它很可能是一个要由 DOS.PrintString 函数 09h 输出的字符串。 $ 字符就像一个终止符;它实际上并没有输出。在这个例子中,前面的字节是一个 CarriageReturn(13)和两个 LineFeed(10)。回车 return 将光标带回屏幕的左边缘,换行使光标在屏幕上下降一行。在这种情况下,光标将下降两行。
指令lea si, array+2
将字符串中第3个字节的偏移地址加载到SI
寄存器。如您所见,该字节不是真正的字符,而是我们所说的 控制代码 。其他一些控制代码是 7 代表 BELL 和 8 代表 BACKSPACE。
13, 10, 10, 112, 105, 110, 101, 97, 112, 112, 108, 101, 32, 36
^ ^
array SI
指令 mov al, [si]
将该字节加载到 AL
寄存器中,在本例中该寄存器现在的值为 10。
指令 cmp al, 'A'
将 AL
中的值 10 与 数字 65 进行比较。这是一个数字,因为汇编器会自动将大写字符 'A' 转换为等效的 ASCII 代码,即 65.
How do I compare two letters in 8086?
如果字符大小写不重要,即 不区分大小写,我们需要确保 cmp
指令的两个操作数使用相同的大小写。
例如。查找 DL
中从 'A' 到 'Z' 的任何大写字符
lea si, array+3 ; Position of the 1st true character
.loop:
mov al, [si]
cmp al, 'a'
jb .cont
cmp al, 'z'
ja .cont
sub al, 32 ; Convert from 'a' to 'z' into 'A' to 'Z'
.cont:
cmp al, dl ; Compare with one of 'A' to 'Z'
...
如果字符大小写很重要,即 区分大小写,则可以立即使用 cmp
指令。
例如。寻找字符'A'(所以不会找到'a')
lea si, array+3 ; Position of the 1st true character
.loop:
mov al, [si]
cmp al, 'A'
...
array db 13,10,10,"pineapple $"
lea si, array+2
mov al, [si]
cmp al, 'A'
这里,字符串值是先转换成ascii再比较吗? 另外,13、10 和 10 意味着什么? array+0和array+1不应该分别包含字符串的总大小和实际大小吗?
像 array db 13,10,10,"pineapple $"
这样的行在内存中创建一个 字节 的字符串:
13, 10, 10, 112, 105, 110, 101, 97, 112, 112, 108, 101, 32, 36
在 16 位编程中,当您看到一个以 $ 字符结尾的字符串时,它很可能是一个要由 DOS.PrintString 函数 09h 输出的字符串。 $ 字符就像一个终止符;它实际上并没有输出。在这个例子中,前面的字节是一个 CarriageReturn(13)和两个 LineFeed(10)。回车 return 将光标带回屏幕的左边缘,换行使光标在屏幕上下降一行。在这种情况下,光标将下降两行。
指令lea si, array+2
将字符串中第3个字节的偏移地址加载到SI
寄存器。如您所见,该字节不是真正的字符,而是我们所说的 控制代码 。其他一些控制代码是 7 代表 BELL 和 8 代表 BACKSPACE。
13, 10, 10, 112, 105, 110, 101, 97, 112, 112, 108, 101, 32, 36
^ ^
array SI
指令 mov al, [si]
将该字节加载到 AL
寄存器中,在本例中该寄存器现在的值为 10。
指令 cmp al, 'A'
将 AL
中的值 10 与 数字 65 进行比较。这是一个数字,因为汇编器会自动将大写字符 'A' 转换为等效的 ASCII 代码,即 65.
How do I compare two letters in 8086?
如果字符大小写不重要,即 不区分大小写,我们需要确保 cmp
指令的两个操作数使用相同的大小写。
例如。查找 DL
lea si, array+3 ; Position of the 1st true character
.loop:
mov al, [si]
cmp al, 'a'
jb .cont
cmp al, 'z'
ja .cont
sub al, 32 ; Convert from 'a' to 'z' into 'A' to 'Z'
.cont:
cmp al, dl ; Compare with one of 'A' to 'Z'
...
如果字符大小写很重要,即 区分大小写,则可以立即使用 cmp
指令。
例如。寻找字符'A'(所以不会找到'a')
lea si, array+3 ; Position of the 1st true character
.loop:
mov al, [si]
cmp al, 'A'
...