一.
BUF DW ‘ad2’ 不可
BUF DW 'ad’ 可
BUF DD ‘ad21’ 可
BUF DW 'ad211’ 不可
BUF DB ‘ad2’ 可
除了DB,其他的超过定义长度(例:DW-2 DD-4)的都不行
二。有关有符号数,无符号数,有符号数输出,无符号数输出
1>大小比较
用四个数为例
6F80H ;-6F80H ; F88AH; -F88AH
ii) 对于无符号数,用JB(小于)比较得到
6F80H, -6F80H,F88AH,-F88AH 始终大于0
( -6F80H -F88AH内存表示的分别是:9080H,0776H)
DATAS SEGMENT
BUF1 DB 'xiaoYU$'
BUF2 DB 'daYU$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
mov ax,-0F88AH ;可更改
CMP AX,0
JB NEXT
JMP P
NEXT:
lea DX,buf1
MOV AH,9
INT 21H
JMP EXIT
P:
lea DX,buf2
MOV AH,9
INT 21H
EXIT:
MOV AH,4CH
INT 21H
CODES ENDS
END START
ii) 对于有符号数,用JL(小于)比较得到
6F80H > 0
-6F80H > 0
F88AH<0
-F88AH>0
把上述代码的JB换成JL即可
2>输出
参考:P144 5.11 无符号
P156 5.21 有符号
1>无符号数
无符号数由于不用考虑符号位,所以输出也很简单
i)输出十进制数
用栈储存,/10余数入栈
ii)输出二进制数 《新一代汇编》P144 5.11
2>有符号数
X DB F88AH表示的是补码为F88AH的数
以十进制输出为例
1.最高位是0 说明它是正数,接下来就是同无符号数的运算(/10一直到没有)
2.最高位是0 但是前面有-,比如X=-6F80H(6F80: 0110 1111 1000 0000),这个时候内存实际存的是-6F80的补码:9080H(1001 0000 1000 0000)。
据CMP+JL判断,我们先输出-,对(1001 0000 1000 0000)进行NEG操作,得到的0110 1111 1000 0000(6F80H),接下来同无符号数的运算输出十进制
插播求补码的方法:《新一代汇编》P10
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反(-x的x就是其余各位), 最后+1. (即在反码的基础上+1)
eg
求-79A8H 的补码,注意79A8H表示的是无符号的数
79A8H的二进制原码: 0111 1001 1010 1000
-79A8H的二进制原码:1111 1001 1010 1000(区别在于最高位符号位变为1)
-79A8H补码(2): 1000 0110 0101 1000
-79A8H补码(16): 8658H
巧解就是第一个非0相加16,之后相加15,相加的对象是79A8H
关于NEG
若对于有符号数AX=FF88H求补码,NEG AX ,得0078H。数是对的,但是符号位不对。
如果是输出,这么求可以输出绝对值;如果是求补码,还要变符号位
符号位有要求的情况:去掉FF88H的符号位得7F88H,再NEG 7F88H,得8078H,为原码
若对于补码AX=8078H求有符号数,NEG AX得7F88H,数是对的,但是符号不对。如果要输出绝对值这么做是对的,但如果符号位也有要求,不对。
符号位有要求的情况:去掉8078H的符号位得0078H,再NEG 0078H,得FF78H,为原码
3.最高位是1,如F88AH,这个数实际上表示的是一个负数,内存存的也是F88AH(1111 1000 1000 1010)。通过JNS判断<0,先输出一个-,再对F88AH求补,输出求补结果
4.最高位是1,但是前面还有一个负号,表示的是正数。比如-F88AH(-1111 1000 1000 1010 ),此时内存存的是0000 0111 0111 0110(F88AH的补码),即0776H。表示的是正数
此时F88AH有符号意味,表示-0076H,由于最前面还有一个-,所以最终表示正数
输出二进制代码
DATAS SEGMENT
X DW -6F80H
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV CH,16
MOV BX,X
L:
MOV CL,1
ROL BX,CL
MOV DL,BL
AND DL,01H
CMP DL,10
JB NEXT
NEXT:
ADD DL,30H
MOV AH,2
INT 21H
DEC CH
JNZ L
MOV AH,4CH
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
三.dos10号调用
原题是通过十号调用输入两个字符串,判断两字符串是否相等。
我们知道str1,str2的第二个单元内储存的是输入的字符串的长度
但是我们发现绿色被隐掉的并不能判断长度,要用下两排才行。
那么我们尝试输出[si]的值(输出的是十六进制),输入的str1的长度是5,但是[si]有16位,低八位表示的是5,高八位不受控制。同理[DI]。
所以他们的高八位不同,无法比较.
而3940排只比较了低八位,所以可以
而且将CL值输出,发现确实是长度(虽然不知道为什么可以这么表示长度)
四。
D表示和E一样的地址,CC表示和A一样的地址