Assembly 两个汇编代码之间的差异

Assembly 两个汇编代码之间的差异,assembly,pep8-assembly,Assembly,Pep8 Assembly,我需要帮助理解汇编语言中的代码,将变量声明为局部变量或全局变量 这段代码之间有什么区别 ;File: fig0647.pep ;Computer Systems, Fourth edition ;Figure 6.47 ; BR main data: .EQUATE 0 ;struct field #2d next: .EQUATE 2 ;struct field #2h ; ;******* main ()

我需要帮助理解汇编语言中的代码,将变量声明为局部变量或全局变量

这段代码之间有什么区别

;File: fig0647.pep
;Computer Systems, Fourth edition
;Figure 6.47
;
     BR      main        
data:    .EQUATE 0           ;struct field #2d
next:    .EQUATE 2           ;struct field #2h
;
;******* main ()
first:   .EQUATE 4           ;local variable #2h
p:       .EQUATE 2           ;local variable #2h
value:   .EQUATE 0           ;local variable #2d
main:    SUBSP   6,i         ;allocate #first #p #value
     LDA     0,i         ;first = 0
     STA     first,s     
     DECI    value,s     ;cin >> value
while:   LDA     value,s     ;while (value != -9999)
     CPA     -9999,i     
     BREQ    endWh       
     LDA     first,s     ;   p = first
     STA     p,s         
     LDA     4,i         ;   first = new node
     CALL    new         ;   allocate #data #next
     STX     first,s     
     LDA     value,s     ;   first->data = value
     LDX     data,i      
     STA     first,sxf   
     LDA     p,s         ;   first->next = p
     LDX     next,i      
     STA     first,sxf   
     DECI    value,s     ;   cin >> value
     BR      while       
     endWh:   LDA     first,s     ;for (p = first
     STA     p,s         
     for:     LDA     p,s         ;   p != 0
     CPA     0,i         
     BREQ    endFor      
     LDX     data,i      ;   cout << p->data
     DECO    p,sxf       
     CHARO   ' ',i       ;      << ' '
     LDX     next,i      ;   p = p->next)
     LDA     p,sxf       
     STA     p,s         
     BR      for         
     endFor:  ADDSP   6,i         ;deallocate #value #p #first
     STOP                
     ;
     ;******* operator new
     ;        Precondition: A contains number of bytes
     ;        Postcondition: X contains pointer to bytes
     new:     LDX     hpPtr,d     ;returned pointer
     ADDA    hpPtr,d     ;allocate from heap
     STA     hpPtr,d     ;update hpPtr
     RET0                
     hpPtr:   .ADDRSS heap        ;address of next free byte
     heap:    .BLOCK  1           ;first byte in the heap
     .END                  
;文件:fig0647.pep
;计算机系统,第四版
;图6.47
;
丁烷
数据:。等于0;结构字段#2d
其次:。等于2;结构字段#2h
;
;******* 主要()
第一:等于4;局部变量#2h
p:=2;局部变量#2h
值:。等于0;局部变量#2d
主要品种:亚种6,i;分配#优先#p#值
lda0,i;第一个=0
STA第一,s
分贝值,s;cin>>值
while:LDA值,s;while(值!=-9999)
CPA-9999,i
BREQ ENDW
LDA first,s;p=第一
斯塔普,s
lda4,i;第一个=新节点
呼唤新;分配#数据#下一步
STX优先,s
LDA值,s;第一->数据=值
LDX数据,i
STA优先,sxf
LDA p,s;第一个->下一个=p
下一步,我
STA优先,sxf
分贝值,s;cin>>值
一会儿
endWh:LDA-first,s;对于(p=第一
斯塔普,s
对于:LDA p,s;p!=0
CPA 0,i
BREQ endFor
LDX数据,i;cout数据
德科p,sxf
CHARO“”,i;next)
ldap,sxf
斯塔普,s
BR代表
endFor:ADDSP 6,i;先解除分配#价值#p#
停止
;
;******* 新接线员
;        前提条件:包含字节数
;        后置条件:X包含指向字节的指针
新的:LDX hpPtr,d;返回指针
ADDA hpPtr,d;从堆中分配
STA-hpPtr,d;更新hpPtr
RET0
hpPtr:。添加RSS堆;下一个空闲字节的地址
堆:。块1;堆中的第一个字节
.完
这个密码呢

         BR      main
         data:    .EQUATE 0           ;struct field #2d
         next:    .EQUATE 2           ;struct field #2h
         ;
         ;.........main()
         first:   .BLOCK  2           ;global variable #2h
         p:       .BLOCK  2           ;global variable #2h     
         value:   .BLOCK  2           ;global variable #2d
         main:    LDA     0,i         ;first = 0
         STA     first,s
         DECI    value,s     ;cin >> value
         while:   LDA     value,s     ;while (value != -9999)
         CPA     -9999,i     
         BREQ    endWh
         LDA     first,s     ;    p = first
         STA     p,s
         LDA     4,i         ;    first = new node
         CALL    new         ;    allocate #data #next
         STX     first,s
         LDA     value,s     ;    first->data = value     
         LDX     data,i
         STA     first,sxf
         LDA     p,s         ;    first->next = p
         LDX     next,i

         STA     first,sxf
         DECI    value,s     ;    cin >> value
         BR      while
         endWh:   LDA     first,s     ;for (p=first)
         STA     p,s
         for:     LDA     p,s         ;    p != 0
         CPA     0,i
         BREQ    endFor
         LDX     data,i      ;    couunt << p->data
         DECO    p,sxf
         CHARO   ' ',s       ;        <<  ' '
         LDX     next,s      ;    p = p->next)
         LDA     p,sxf
         STA     p,s
         BR      for
         endFor:  STOP
         ;
         ;....... operator new
         ;        Precondition: A contains number of bytes
         ;        Postcondition: X contains pointer to byte
         new:     LDX     hpPtr,d     ;returned pointer
         ADDA    hpPtr,d     ;allocate from heap
         STA     hpPtr,d     ;update hpPtr
         RET0
         hpPtr:   .ADDRSS heap        ;address of next free byte
         heap:    .BLOCK  1           ;first byte in the heap
         .END
BR main
数据:。等于0;结构字段#2d
其次:。等于2;结构字段#2h
;
;.........main()
第一:第二区;全局变量#2h
第2区;全局变量#2h
值:。块2;全局变量#2d
主:LDA 0,i;第一个=0
STA第一,s
分贝值,s;cin>>值
while:LDA值,s;while(值!=-9999)
CPA-9999,i
BREQ ENDW
LDA first,s;p=第一
斯塔普,s
lda4,i;第一个=新节点
呼唤新;分配#数据#下一步
STX优先,s
LDA值,s;第一->数据=值
LDX数据,i
STA优先,sxf
LDA p,s;第一个->下一个=p
下一步,我
STA优先,sxf
分贝值,s;cin>>值
一会儿
endWh:LDA-first,s;对于(p=第一个)
斯塔普,s
适用范围:LDA p,s;p!=0
CPA 0,i
BREQ endFor
LDX数据,i;装载数据
德科p,sxf
沙罗;下一步)
ldap,sxf
斯塔普,s
BR代表
结束:停止
;
;....... 新接线员
;        前提条件:包含字节数
;        后置条件:X包含指向字节的指针
新的:LDX hpPtr,d;返回指针
ADDA hpPtr,d;从堆中分配
STA-hpPtr,d;更新hpPtr
RET0
hpPtr:。添加RSS堆;下一个空闲字节的地址
堆:。块1;堆中的第一个字节
.完
任何形式的帮助都将不胜感激

变体1:
在启动时向某个堆栈指针添加6个字节(为变量保留6个字节),“first”、“p”、“value”只是汇编程序的别名(要知道应该存储哪个变量,与C中定义前2个变量相同),并且没有为这些
生成代码。equale

BR main                      ; <-- this BR is unneeded, there's no code from here to main
...
first:   .EQUATE 4           ;local variable #2h
p:       .EQUATE 2           ;local variable #2h
value:   .EQUATE 0           ;local variable #2d
main:    SUBSP   6,i         ;allocate #first #p #value
BR main;
BR      main            ; this BR makes sense, there's code inbetween this and main
first:   .BLOCK  2           ;<-- here e.g. a "00 00" appears INSIDE the code
p:       .BLOCK  2           ;global variable #2h     
value:   .BLOCK  2           ;global variable #2d
main:    LDA     0,i