有关汇编的杂碎知识(仅记录,未整理)

一.
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一样的地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值