1.tos label word 在汇编语言什么意思 有什么作用 请高手指点
用法为:
buffer(变量) LABEL WORD(字类型)例如:Buffer1 LABEL WORD
Buffer2 DB 20 DUP (0)
通常,紧接着的下一条语句定义的类型与LABEL指定的类型不同。而实际上,Buffer1是Buffer2的别名,两者指向内存中的同一个存储地址。换言之,同一组数据定义了两种不同的类型,在接受不同数据类型的访问时,可以指定相应的标号。如接受一个字类型数据访问时,使用Buffer1;接受字节类型数据访问时,使用Buffer2。否则因为数据类型不匹配,编译器编译时将出现异常。
说到LABEL,也不得不提到另一个与之功能相近的伪指令THIS。THIS通常也与它的下一条变量定义语句相关,因为在数据类型过多的情况下接受不同数据类型访问时,使用PTR属性限定符显得十分繁琐,比如起初定义了变量:
Buffer1 EQU THIS WORD
Buffer2 DB 20 DUP (0)
假设有如下语句:
mov AX, Buffer1
mov AX, Buffer2
其中,在作字类型访问时,mov AX, Buffer1相当于mov AX, WORD PTR Buffer2,这样省去了繁琐的PTR操作符。
以上两条语句在内存中的安排:
2.汇编 段定义 label
stack定义堆栈段,只是个名字,你也可以改其他。LABEL的功能是定义变量或标号的类型,而变量或标号的段属性和偏移属性由该语句所处的位置确定。例如:
Buffer1 LABEL WORD
Buffer2 DB 20 DUP (0)
通常,紧接着的下一条语句定义的类型与LABEL指定的类型不同。而实际上,Buffer1是Buffer2的别名,两者指向内存中的同一个存储地址。换言之,同一组数据定义了两种不同的类型,在接受不同数据类型的访问时,可以指定相应的标号。如接受一个字类型数据访问时,使用Buffer1;接受字节类型数据访问时,使用Buffer2。否则因为数据类型不匹配,编译器编译时将出现异常。
3.汇编语言堆栈的问题
题目给的是一.LST文件,先还原为PSTACK.ASM
STACKSG SEGMENT STACK
DW 32 DUP(?)
TOP LABEL WORD
STACKSG ENDS
CODESG SEGMENT
ASSUME CS:CODESG,SS:STACKSG
BEGIN PROC FAR
MOV AX,STACKSG
MOV SS,AX
MOV SP,OFFSET TOP
PUSH DS
XOR AX,AX
PUSH AX
CALL B10
RET
BEGIN ENDP
B10: PROC NEAR
CALL C10
RET
ENDP
C10: PROC NEAR
RET
ENDP
CODESG ENDS
END BEGIN
用MASM和LINK汇编链接得PSTACK.EXE
再运行CMD进到命令提示符下:
输入DEBUG PSTACK.EXE(回车),依次键入:
-d:0 显示如下:
13DC:0000 CD 20 FF 9F 。 。
先记下PSP段地址为13DCH;再输入
-r 显示:
DS=13DC ES=13DC SS=13EC CS=13F0 IP=0 。
再输入
-t=0
-t
输入n个t后,到IP=40时,SP=0038H,堆栈最满.
此时执行
-dss:0,显示:
13EC:0030 00 00 14 00 F0 13 F0 0D-13 00 0F 00 00 00 DC 13
由于每台电脑执行程序时,浮动地址不一,题目给定
PSP=1234H,与本机PSP段地址为13DCH相差后,依次填入下表:
位移 栈内容 [十六进制]
(0032) (0014) ;IP 入栈
(0034) (1248) ;CS 入栈
(0036) (0584)
(0038) (0013) ;IP 入栈
(003A) (000F)
(003C) (0000);push ax 时入栈的数据
(003E) (1234);push ds 时入栈的段址
SP=0038H
4.找个高手帮忙分析下汇编程序
注释前面有感叹号的是我加的提示或者修改,请过目:
DATA SEGMENT
N DB 6 ; 前N项和的N
DATA1 DW 0 ; 保存结果
DATA ENDS
STACKS SEGMENT ;!其实这个程序没用到栈
DW 100H DUP(?) ; 256字节的栈空间
TOP LABEL WORD ; top保存栈顶位置
STACKS ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA ; 初始化数据段
MOV DS,AX
MOV AX,STACKS ; 初始化栈顶
MOV SS,AX
LEA SP,TOP ; sp指向栈定
MOV CL,N ; 初始化cx为循环次数N
MOV CH,0
XOR AX,AX ; 初始化ax,保存累加结果
MOV BX,1 ; 首项为1
CMP CX,0 ; 如果N == 0则直接结束程序
JE a2
a1: ADD AX,BX ; 保存累加结果到ax
INC BX ;!这句错了吧,应该是add bx, 2
LOOP a1 ; 循环求解
mov DATA1, ax ;!加一句保存结果吧
a2:
MOV AH,4CH ; 结束程序
INT 21H
CODE ENDS
END START
DATA SEGMENT
STRING1 DB 'MATCH!',0AH,0DH,'$'
STRING2 DB 'NO MATCH!',0AH,0DH,'$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AH,01H ; 调用01号dos功能从键盘接收一个字符的输入
INT 21H ; al是输入的字符
CMP AL,'Y' ; 比较al和字符'Y'
JNZ NEXT ; 不相等则跳到next处执行
MOV AH,09H ; 调用09号dos中断输出字符串
LEA DX,STRING1 ; 输出match
INT 21H
JMP EXIT0 ; 跳至程序结尾,结束程序
NEXT:
MOV AH,09H ; 调用09号dos功能输出字符串
LEA DX,STRING2 ; 输出no match
INT 21H
EXIT0:
MOV AH,4CH ; 结束程序
INT 21H
CODE ENDS
END START
5.一段很简单的汇编程序
楼主,你这个也没有实质性的程序啊!除了数据段的定义,就是堆栈段的定义,没什么好注释的。若非要注释,只能把这两个段给你区分开,别的真就没什么可注释的了。
stack segment para stack 'stack' ;定义堆栈段
db 256 dup(0) ;用db不正确,应该用dw,堆栈段都是自数据
top label word ;top堆栈指针
stack ends
data segment para public 'data' ;定义数据段
. ;中间这些都是定义的一些数据
.
.
data ends
code segment ;定义代码段
assume cs:code,ds:data,es:data,ss:stack ;段寄存器说明
start: ;代码段开始
mov ax,data
mov ds,ax
mov es,ax
.
.
.
mov ah,4ch ;dos功能调用4ch号功能,结束程序,返回操作系统
int 21h ;dos功能调用
code ends ;代码段结束
end start ;编译结束伪指令
转载请注明出处51数据库 » 汇编toplabelword
咖啡泡饭007