Assembly 使用数据段和循环的汇编x86编码

Assembly 使用数据段和循环的汇编x86编码,assembly,x86,masm,irvine32,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 so

下面的代码从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

检查您的代码,我看到您使用的是AL(inc AL),而不是EAX。因此,您可以将某些数据直接分配给AL。或者您可以通过先清除它来使用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
因为有些数据是BYTE类型的,所以必须使用AL,而不是EAX,但是,如果要使用EAX(大小为DWORD),只需先清除它,这样它的所有字节中都将有零,并且在EAX中以AL值为准


顺便说一下,你是在用ASCII字符计数,我的意思是,你不是在计算1,2,3。。。但是“1”,“2”,“3”。。。如果您想在9点停止,这不是问题,但是如果您想在10点、11点……停止,您需要将某些数据从“1”更改为1。在这种情况下,为了在屏幕上显示一些数据,您必须创建一个从数字到字符的转换过程,可能WriteDec就是这样做的。

您忘记发布包含的文件“Irvine32.inc”。我想WriteString、WriteDec和Crlf程序应该在那里。没有它们我无法运行你的程序。我在另一台机器上有它们,我会发回。非常抱歉。我需要使用someData中的“1”