堆棧代碼
A. STACKS SEGMENT ;此處輸入堆棧段代碼 STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS
DATAS SEGMENT
;此處輸入數據段代碼
DATAS ENDS
STACKS SEGMENT
;此處輸入堆棧段代碼
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV WORD PTR ds:[0100H], 5564H
MOV WORD PTR ds:[0102H], 0C279H
MOV AX, ds:[0100H]
PUSH AX
ADD AL, ds:[0102H];說明標志位是如何確定的
ADC AH, ds:[0103H];說明指令執行原理,包括標志位
MOV ds:[0104H], AX
POP AX
SUB AL,ds: [0102H] ;說明標志位是如何確定的
SBB AH, ds:[0103H];說明指令執行原理,包括標志位
MOV ds:[0106H], AX
MOV AH,4CH
INT 21H
CODES ENDS
END START
說明:我把你的代碼全部復制,然後在debug裡面編譯,首先錯誤是那些分號不對。把分號改過來,之後是存儲器直接定址錯誤,直接定址的問題參考下面:
B. 存儲器中有若干數據類型:指令代碼,運算數據,堆棧數據,字元代碼和BCD碼,計算機是如何識別這些代碼的
數據和指令抄都以二進制代碼的形式存儲在存儲器。 從代碼本身無法區別它是數據還是指令,CPU在取指令時把從存儲器中讀取的信息都看作指令,在讀取數據時從存儲器中讀取的信息都看成是數據。 為了區分運算的數據和程序中的指令,程序員在編寫程序時需要知道每個數據的存儲位置以及指令的存儲位置,以避免指令當作數據,或者將數據當然指令。
C. 匯編中,每個題都要定義數據,堆棧,代碼段嗎
匯編中,一個程序由數據段、堆棧段、代碼段和附加段構成,其中附加段可有可無,而前三個段一般都要有。
D. 用C#編寫一個堆棧的代碼
寫一個結構~
要分配空間
STACK需要有頂指針 當前指針
POP PUSH
大概這些吧
E. 求用C(TC)程序編寫堆棧的基本操作函數的源代碼
用來進行數制轉換的。。
#include<stdio.h>
#include<malloc.h>
#include<windows.h> //清屏
#define NULL 0
int i_B=2,i_O=8,i_D=10,i_H=16; //全局常量
typedef struct Number
{int num;
struct Number *next;
}Num;
void Push(int iNum,int i); //轉換數字,進棧,iNum為待轉換的數,i代表進制
void Pop(struct Number *top,int i); //顯示結果,出棧,top為棧頂指針,i代表進制
void Conver(int i); //二進制與八進制調用此函數
void Conver_D(int i); //十進制調用此函數
void Conver_H(int i); //十六進制調用此函數
int TestStr(char *cNumber,int i); //檢測數據是否合法
void main()
{ char choose,cGo,cExit;
while(1)
{
system("cls");
printf("************************ 數制轉換器 ************************\n\n");
printf(" 二進制(B)\t八進制(O)\t十進制(D)\t十六進制(H)\n\n");
printf("請選擇待轉換的數字類型<Enter>: ");
scanf("%s",&choose);
switch(choose)
{ case 'B':
case 'b':
Conver(i_B); //二進制
break;
case 'O':
case 'o':
Conver(i_O); //八進制
break;
case 'D':
case 'd':
Conver_D(i_D); //十進制
break;
case 'H':
case 'h':
Conver_H(i_H); //十六進制
break;
default:
printf("\n選擇時出錯!請輸入指定的字元,不區分大小寫~\n\n");
}//switch
printf("繼續轉換嗎(y/n)? ");
scanf("%s",&cGo);
if(cGo=='y'||cGo=='Y') continue;
else {printf("確定退出(y/n)? ");
scanf("%s",&cExit);
if(cExit=='y'|| cExit=='Y')
{printf("\n按任意鍵結束...\n");
getchar();
break;}
else continue;}
}//while
}
void Push(int iNum,int i) //進棧
{struct Number *top=NULL,*NewP;
while(iNum!=0)
{
NewP=(struct Number *)malloc(sizeof(struct Number));
if(top==NULL)
{NewP->next=NULL;
top=NewP;
top->num=iNum%i;}
else
{NewP->next=top;
top=NewP;
top->num=iNum%i;
}
iNum=iNum/i;
}//while
Pop(top,i);
printf("\n");
}
void Pop(struct Number *top,int i) //出棧
{ if(top==NULL)
printf("棧空!\n");
else
{ char cell[]="0123456789ABCDEF";
struct Number *temp,*q;
switch(i)
{ case 8: //輸出八進制
case 16: //輸出十六進制
temp=top;
while(temp!=NULL)
{printf("%c",cell[temp->num]);
q=temp;temp=temp->next;free(q);}
break;
case 2: //輸出二進制
int counter=0; //counter用於輸出四個數後加空格
temp=top;
while(temp!=NULL)
{++counter;
printf("%c",cell[temp->num]);
q=temp;temp=temp->next;free(q);
if(counter%4==0) printf(" ");}
break;
}//switch
}//else
}
void Conver(int i) //二進制與八進制,原理:先轉換成十進制數,再轉換成其它進制
{ char *p,Bit[21];
int Result=0,iRec;
p=Bit;
printf("\n請輸入一個%d進制數<Enter>: ",i);
while(1)
{scanf("%s",Bit);
iRec=TestStr(p,i); //檢測數據的合法性
if(iRec==0) break;
else printf("請重新輸入<Enter>: ");
}
while((*p)!='\0') //轉換成十進制
{ Result=Result*i+(*p)-'0';
p++;}
printf("\n********************** 轉換後結果為: ***********************\n");
if(i==2)
{printf("\n\t\t八進制:");
Push(Result,i_O);}
else
{printf("\n\t\t二進制:");
Push(Result,i_B);}
printf("\n\t\t十進制:%d\n",Result);
printf("\n\t 十六進制:");
Push(Result,i_H);
printf("\n************************ 轉換完畢! *************************\n");
}
void Conver_D(int i) //十進制
{ char *p,Bit[21];
int RetD=0,iRec_D;
p=Bit;
printf("\n請輸入一個%d進制數<Enter>: ",i);
while(1)
{scanf("%s",Bit);
iRec_D=TestStr(p,i); //檢測數據的合法性
if(iRec_D==0) break;
else printf("請重新輸入<Enter>: ");
}
while((*p)!='\0')
{ RetD=RetD*i+(*p)-'0';
p++;}
printf("\n********************** 轉換後結果為: ***********************\n");
printf("\n\t\t二進制:");
Push(RetD,i_B);
printf("\n\t\t八進制:");
Push(RetD,i_O);
printf("\n\t 十六進制:");
Push(RetD,i_H);
printf("\n************************ 轉換完畢! *************************\n");
}
void Conver_H(int i) //十六進制,先轉換成十進制,再轉換成其它進制
{ char *p,Bit[21];
int RetH=0,iRec_H;
p=Bit;
printf("\n請輸入一個十六進制數<Enter>: ");
while(1)
{scanf("%s",Bit);
iRec_H=TestStr(p,i); //檢測數據的合法性
if(iRec_H==0) break;
else printf("請重新輸入<Enter>: ");
}
while((*p)!='\0') //十六進制轉換成十進制
{
switch(*p)
{case 'A':
case 'a':RetH=RetH*16+10;break;
case 'B':
case 'b':RetH=RetH*16+11;break;
case 'C':
case 'c':RetH=RetH*16+12;break;
case 'D':
case 'd':RetH=RetH*16+13;break;
case 'E':
case 'e':RetH=RetH*16+14;break;
case 'F':
case 'f':RetH=RetH*16+15;break;
default:RetH=RetH*16+(*p)-'0';}
p++;
}
printf("\n********************** 轉換後結果為: ***********************\n");
printf("\n\t\t二進制:");
Push(RetH,i_B);
printf("\n\t\t八進制:");
Push(RetH,i_O);
printf("\n\t\t十進制:%d\n",RetH);
printf("\n************************ 轉換完畢! *************************\n");
}
int TestStr(char *cNumber,int i) //檢測數據是否合法
{ char *cMove;
int n;
cMove=cNumber;
switch(i)
{case 2:
while((*cMove)!='\0')
{
if((*cMove)=='0'||(*cMove)=='1') {n=0;cMove++;}
else {printf("\n%s不是二進制數據,",cNumber);n=1;break;}
}
return(n);
break;
case 8:
while((*cMove)!='\0')
{
if((*cMove)>='0' && (*cMove)<='7') {n=0;cMove++;}
else {printf("\n%s不是八進制數據,",cNumber);n=1;break;}
}
return(n);
break;
case 10:
while((*cMove)!='\0')
{
if((*cMove)>='0' && (*cMove)<='9') {n=0;cMove++;}
else {printf("\n%s不是十進制數據,",cNumber);n=1;break;}
}
return(n);
break;
case 16:
while((*cMove)!='\0')
{
if(((*cMove)>='0' && (*cMove)<='9') || ((*cMove)>='A'&&(*cMove)<='F') || ((*cMove)>='a'&&(*cMove)<='f')) {n=0;cMove++;}
else {printf("\n%s不是十六進制數據,",cNumber);n=1;break;}
}
return(n);
break;
}//switch
}
F. c語言中的堆棧區變數區和匯編學的堆棧段代碼段的區別
一個由C/C++編譯的程序佔用的內存分為以下幾個部分
1、棧區(stack)
由編譯器自動分配釋放
,存放函數的參數值,局部變數的值等。其操作方式類似於數據結構中的棧。
2、堆區(heap)
一般由程序員分配釋放,
若程序員不釋放,程序結束時可能由OS回收
。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表,呵呵。
3、全局區(靜態區)(static),全局變數和靜態變數的存儲是放在一塊的,初始化的全局變數和靜態變數在一塊區域,
未初始化的全局變數和未初始化的靜態變數在相鄰的另一塊區域。
-
程序結束後有系統釋放
4、文字常量區
常量字元串就是放在這里的。
程序結束後由系統釋放
5、程序代碼區
存放函數體的二進制代碼
匯編代碼中的數據段、堆棧段、代碼段、附加段具體指:
代碼段,數據段,分別存入程序和數據
堆棧段是一塊空白的空間用來為堆棧操作作準備
附加段是對數據段的補充
數據
有位元組DB,字DW,雙字DD,長字DQ和十位元組變數DT
希望對你有所幫助,望點贊!!!
G. 求C語言堆棧代碼。靜態就行,只要有 出,入,取棧頂就行了
typedef struct
{
DataType stack[MaxStackSize];
int top;
}SeqStack;
//初始化StackInitiate(S)
void StackInitiate(SeqStack *S) //初始化順序堆棧S
{
S->top=0; //定義初始棧頂下標值
}
//非空否y(S)
int StackNotEmpty(SeqStack S)
//判斷順序堆棧S非空否,非空返回1,否則返回0
{
if(S.top<=0)
return 0;
else
return 1;
}
//入棧StackPush(SeqStack *S,DataType x)
int StackPush(SeqStack *S,DataType x)
//把數據元素值x壓入順序堆棧S,入棧成功返回1,否則返回0
{
if(S->top>=MaxStackSize)
{
printf("堆棧已滿無法插入!\n");
return 0;
}
else
{
S->stack[S->top]=x;
S->top++;
return 1;
}
}
//出棧StackPop(SeqStack *S,DataType *d)
int StackPop(SeqStack *S,DataType *d)
//彈出順序堆棧S的棧頂數據元素值到參數d,出棧成功返回1,否則返回0
{
if(S->top<=0)
{
printf("堆棧已空無數據元素出棧!\n");
return 0;
}
else
{
S->top--;
*d=S->stack[S->top];
return 1;
}
}
//取棧頂數據元素StackTop(SeqStack S,DataType *d)
int StackTop(SeqStack S,DataType *d)
//取順序堆棧S的當前棧頂元素值到參數d,。成功返回1,否則返回0
{
if(S.top<=0)
{
printf("堆棧已空!\n");
return 0;
}
else
{
*d=S.stack[S.top-1];
return 1;
}
}
//測試代碼
#include<stdio.h>
#include<stdlib.h>
#define MaxStackSize 100 //定義MaxStackSize為100
typedef int DataType;
#include"SeqStack.h"
void main(void)
{
SeqStack myStack;
int i,x;
StackInitiate(&myStack); //初始化
for(i=0;i<10;i++)
{
if(StackPush(&myStack,i+1)==0) //入棧10個數據元素
{
printf("錯誤!\n");
return ;
}
}
if(StackTop(myStack,&x)==0) //取棧頂數據元素
{
printf("錯誤!\n");
return ;
}
else
printf("當前棧頂數據元素為:%d\n",x);
printf("依次出棧的數據元素序列如下:\n");
while(StackNotEmpty(myStack))
{
StackPop(&myStack,&x); //出棧
printf("%d\t",x); //顯示數據元素
}
}
H. 匯編中的堆棧段、代碼段 是什麼 是干嗎的
lz知不知道什麼叫段?段就是由寄存器指示的一段內存空間。
堆棧段:這段空間負責函數調用,比如所有局部變數都是存在於這里。
代碼段:這段空間存儲你的指令(指令不用解釋了吧)。
圖書:王爽的《匯編語言程序設計》或者 楊季文 《80x86匯編語言程序設計教程》
(名字不一定對,lz到google搜搜看)
I. 一段關於堆棧的代碼,怎末實現不了啊,幫忙改改啊
你可以參考一下下面的代碼:
#include <iostream.h>
class stack; //前向聲明stack類
class node
{
private:
int data;
node *prev;
public:
node(int d,node *n)
{
data=d;
prev=n;
}
friend class stack; //定義友元類
};
class stack
{
private:
node *top;
public:
stack(){top=0;}
void push(int i);
int pop();
};
void stack::push (int i)
{
node *n=new node(i,top);
top=n;
}
int stack::pop ()
{
node *t=top;
if(top)
{
top=top->prev;
int c=t->data;
delete t;
return c;
}
return 0;
}
main()
{
int c;
stack s;
for(int j=0;j<10;++j)
{
cin>>c;
s.push (c);
}
for(j=0;j<10;++j)
cout<<s.pop ()<<" ";
cout<<endl;
return 1;
}
J. 電腦中堆棧代碼執行攻擊
如何查看程序的運行棧之~如果你認可我的回答,請及時點擊【點贊為滿意回答】按鈕~~手機提問的朋友在客戶端右上角評價點【滿意】即可。~你的點贊是我前進的動力~~O(∩_∩)O,記得好評和點贊,互相幫助,謝謝。