汇编x86编码与数据段和循环

时间:2015-03-17 19:40:17

标签: assembly x86 masm irvine32

下面的代码从someData数据段打印出'1'。然后它打印出数字1到5.我想使用数据段中的'1'而不是mov eax,1设置的1。不知道该怎么做。当我使用字符'1'时,我认为我可以添加它来获取下一个数字而不是进行并增加到al寄存器。

INCLUDE Irvine32.inc
.data
someData BYTE "1",0dh,0ah,0
.code
main PROC
  call TEST 
 exit
main ENDP

TEST PROC
  mov  edx,OFFSET someData  ; this is just for testing
  call WriteString          ; just for testing

  mov  ecx,5
  mov  eax,1
L1: 
  call WriteDec  ; EAX is a counter
  call Crlf
  inc  al        ; next character
  Loop L1
  ret
TEST ENDP

END main

1 个答案:

答案 0 :(得分:0)

检查您的代码,我发现您使用的是AL(包含),而不是EAX。所以你可以直接向AL提供someData。或者您可以先通过清除它来使用EAX。我修改了您的代码以进行此更改:

.stack 100h
.data
someData BYTE "1",0dh,0ah,0   
.code
main PROC
  call TEST 
  mov  ax,4c00h
  int  21h
main ENDP

TEST PROC
  mov  dx,OFFSET someData  ; this is just for testing
  mov  ah,9
  int  21h ;DISPLAY SOMEDATA.

  mov  ecx,5
  mov  eax,0       ;CLEARING EAX, NOW SOMEDATA
  mov  al,someData ;IS IN WHOLE EAX.  
L1: 
  call WriteDec  ; EAX is a counter
  call Crlf
  inc  al        ; next character
  Loop L1
  ret
TEST ENDP

END main

因为someData是BYTE类型,你必须使用AL,而不是EAX,但是,如果你想使用大小为DWORD的EAX,只需先清除它,所以它的所有字节都会有零,而AL价值将在EAX中占上风。

顺便说一句,你使用的是ASCII字符来统计,我的意思是,你不算1,2,3 ......但是" 1"," 2",& #34; 3" ...如果你想停在9,这不是问题,但是如果你想要10,11 ......,你将需要更改#34; 1&#34中的someData ;在这种情况下,为了在屏幕上显示someData,你必须创建一个从数字转换为字符的过程,也许这就是WriteDec所做的事情。